Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 循环迭代_C_Struct - Fatal编程技术网

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);
    /*     ^ */