C 循环迭代
我在编写执行以下操作的代码时遇到问题:声明一个C 循环迭代,c,struct,C,Struct,我在编写执行以下操作的代码时遇到问题:声明一个struct{char c;int x;}数组,并通过循环使用scanf加载它。加载后,将调用函数f,该函数将用0替换结构组件c中出现的所有数字,并返回被零替换的数字之和 下面是代码和输出,我有一个问题,函数f中的循环似乎迭代了一次,它给出了一些非常奇怪的值 这是一道考试题,因此我必须使用printf,scanf等。我还有一个小时的考试,因此任何快速帮助都非常感谢:) 代码: 第一次输入后按enter键时,换行符不会被scanf扫描,而是留在输入缓冲
struct{char c;int x;}
数组,并通过循环使用scanf
加载它。加载后,将调用函数f
,该函数将用0替换结构组件c
中出现的所有数字,并返回被零替换的数字之和
下面是代码和输出,我有一个问题,函数f
中的循环似乎迭代了一次,它给出了一些非常奇怪的值
这是一道考试题,因此我必须使用printf
,scanf
等。我还有一个小时的考试,因此任何快速帮助都非常感谢:)
代码:
第一次输入后按enter键时,换行符不会被
scanf
扫描,而是留在输入缓冲区中。然后,当您尝试读取数字时,scanf会看到换行符而不是数字,因此不会扫描任何内容
简单的解决方案是在格式前面添加一个前导空格:
scanf(" %c", &niz[i].c);
scanf(" %d", &niz[i].x);
/* ^ */
这会告诉scanf跳过空白。使用
niz[i].c=getchar()代码>
而不是
scanf(“%c”,&niz[i].c)代码>
或者,您可以使用其他更好的方法来获取SO讨论的char
输入
现在,
第二次您只提供了一次输入,这是因为您在将2
作为第一次char
的输入输入后按下的Enter保留在输入缓冲区中,并在第二次迭代时读取
您将获得10
作为输出,因为它是\r
的ASCII,输入。它不是一个数字,因此没有被替换为'0'
我正在查看您的代码(我已经十年没有使用console了,但是)以下是一些见解:
尝试使用其他名称重命名MAX
- 不知道您的IDE,但有时会保留MAX
- 将其用作宏可能会在某些编译器上造成问题
将scanf(“%c”、&niz[i].c)更改为scanf(“%c”、&niz[i].c))
- 只是为了将正确的adsress发送给scanf
将scanf(“%d”、&niz[i].x)更改为scanf(“%i”、&niz[i].x))
将%d更改为正确的值(这是您的主要问题)
- 字符的“%c”
- “%i”表示int
如果以上几点没有帮助,试着逐行跟踪,并观察不正确的变量变化奇怪的值?
因为您忘记了行后面的“\n”,所以下一次打印在“i=%d”行后面。
并且,检查每个函数的返回值,除了返回void的函数。当您在调试器中单步执行代码时会发生什么?A没有单步执行,不知道如何执行。我只能说它编译时没有任何错误或警告。@Sinisa它编译时没有任何错误或警告,但我可以在main中看到多个int i
声明。仅供参考始终使用int main()
您需要学习如何调试(即如何使用调试器,或者至少如何添加调试printf语句),否则您在学习编程方面不会有太大进展。你编写的每个程序也需要调试。试着用-Wall
选项编译它。检查扫描的返回值总是有帮助的。这解决了问题,而且我刚刚发现我得到了奇怪的“i”值,因为a在打印后忘了放新行。感谢您提供了一个快速的解决方案。不幸的是,我不能使用getchar(),只能使用printf和scanf,正如我在主要帖子中提到的那样。此外,我在发布后发现了“0”,因此这也是固定的:)感谢您的输入。我使用的是sublime text 2和minigw gcc,据我所知%d对于整数是合法的,到目前为止没有任何问题。另外,Joachims建议在scanf中的%d之前插入空格解决了这个问题,因此寻址似乎在scanf中正常工作,至少在gcc中是这样。“%d”表示十进制(任何整数类型)”%i”严格为int,我过去在“%d”方面遇到过问题,所以我更喜欢“%i”,使用%d而不是%c的scanf将更改4个字节而不是1个字节,并且可以覆盖不应更改的内容。。。(这是最有可能导致循环奇怪的原因)
enter
2
2
2
niz[i].c = 2
i = 048
2
10
2
n = 2
scanf(" %c", &niz[i].c);
scanf(" %d", &niz[i].x);
/* ^ */