mxwawaawxm 发表于 2020-2-29 22:09

这串C代码哪里出错了

本帖最后由 mxwawaawxm 于 2020-3-1 19:09 编辑

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>


#define MAXCNT 3

/*--- C语言的关键字和库函数 ---*/
const char *cstr[] = {
    "auto", "break", "case", "char",
};

void input_ch(const char *str, int *mistake);
void clang_train(const char *mes, const char **cstr, int len);

int main(int argc, const char *argv[])
{
    srand(time(NULL));
   
    clang_train("C语言的单词", cstr, sizeof(cstr)/sizeof(cstr));
   
    return 0;
}

void clang_train(const char *mes, const char **cstr, int len)
{
    int i;
    int rand_idx;
    int mistake=0;
   
    printf("\n练习%d个%s。\n", MAXCNT, mes);
    printf("按下空格键开始。\n");
    while (getch()!=' ') {
      ;
    }
   
    for (i=0;i<MAXCNT;i++) {
      rand_idx=rand()%len;
      input_ch(*(cstr+rand_idx), &mistake);
    }
   
    printf("\r题目:%d字符/错误:%d次\n", MAXCNT*10, mistake);
}

/*依次输入单个字符*/
void input_ch(const char *str, int *mistake)
{
    int j=0;
    int ch;
   
    while (*str!='\0') {
      putch('\r');
      ch=getch();
      if (ch==*str) {
            j++;
            str++;
            printf("\r%s%*s", str, j, "");
      } else {
            (*mistake)++;
            printf("\a");
      }
    }
}

症状如下,到这里始终运行不下去。本来是设计成按下空格,就继续下面的代码。可是无论按什么键,都走不下去
    printf("按下空格键开始。\n");
    while (getch()!=' ') {
      ;
    }


初步测试,应该是这个函数出错了
void input_ch(const char *str, int *mistake)
当我注释掉,就可以了

可是编译也通过,运行也没报错。单独测试这个函数,也可以。到底哪里出错了{:301_1007:}

庸人误我 发表于 2020-2-29 22:58


不是程序的问题,程序其实一直在执行,是你这个难度太高了,我加了这行代码调试了下。
每次要猜出是哪一个字符串,而且只能靠一个\a的提示音。

那年听风 发表于 2020-2-29 22:10

非酋的春天 发表于 2020-2-29 22:16

你在做什么东西呢

mxwawaawxm 发表于 2020-2-29 22:21

非酋的春天 发表于 2020-2-29 22:16
你在做什么东西呢

大致是
const char *cstr[] = {"auto", "break", "case", "char",};
1、大致是先有一个字符指针数组,里面元素分别指向一些字符串
2、用户输入空格表示开始,进入第3步骤。否则不断循环
    while (getch()!=' ') {
      ;
    }
3、随机找出一项字符串,让用户输入。比如auto,用户逐个输入字符。输错提示响铃声,输对则打印后面的字符

jyyjyy 发表于 2020-2-29 22:50

本帖最后由 jyyjyy 于 2020-2-29 22:58 编辑

可以运行
@mxwawaawxm 你要的功能是什么
/*依次输入单个字符*/
void input_ch(const char *str, int *mistake)
{
    int j=0;
    int ch;
    printf("\r%s",str);
    while (*str!='\0') {
      putch('\r');
      ch=getche();
      if (ch==*str) {
            j++;
            str++;
            printf("\r%s", str);
      } else {
            (*mistake)++;
            printf("\a\r%s", str);
      }
    }
}

mxwawaawxm 发表于 2020-2-29 23:06

庸人误我 发表于 2020-2-29 22:58
不是程序的问题,程序其实一直在执行,是你这个难度太高了,我加了这行代码调试了下。
每次要猜出是哪一 ...

谢谢。明白了。我又犯了这么低端的错误{:301_971:}
少了一行代码
printf("\r%s\r", *(cstr+rand_idx));
我还以为卡在这里不动了
    while (getch()!=' ') {
      ;
    }
你说的调试,是用Visual Studio调试吗

mxwawaawxm 发表于 2020-2-29 23:07

jyyjyy 发表于 2020-2-29 22:50
可以运行
@mxwawaawxm 你要的功能是什么
/*依次输入单个字符*/


谢谢
6楼给出了缺漏的地方

absman1972 发表于 2020-3-1 00:55

善用編譯器的Debug功能
實在不熟悉,可以自己手動加一些printf
這樣可以幫助判斷程式碼跑到那裡
避免先入為主的人工判斷

mxwawaawxm 发表于 2020-3-1 18:57

absman1972 发表于 2020-3-1 00:55
善用編譯器的Debug功能
實在不熟悉,可以自己手動加一些printf
這樣可以幫助判斷程式碼跑到那裡


用的是notepad++,不知道怎么调试{:301_1007:}
页: [1] 2
查看完整版本: 这串C代码哪里出错了