编写执行以下操作的代码时遇到问题:声明struct{char c; int x; }
数组并通过循环使用scanf
加载它。在加载之后,将调用函数f
,它将用0替换struct的组件c
中的每个数字,并返回由零替换的数字之和。
代码和输出在下面,我有问题,函数f
中的循环似乎迭代了一次,并且它给出了一些非常奇怪的值。
这是一个考试问题,所以我必须使用printf
,scanf
等。此外,我在一小时内参加考试,因此欢迎任何快速帮助:)
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX 2
struct par {
char c;
int x;
};
int f(struct par *niz) {
int i;
int n=0;
for(i=0; i<MAX; i++) {
if(isdigit(niz[i].c)) {
niz[i].c = niz[i].c-'0';
printf("niz[i].c = %d\n i = %d", niz[i].c, i);
n=n+niz[i].c;
niz[i].c='0';
}
}
return n;
}
void main() {
int n;
int i;
struct par niz[MAX];
printf("enter\n");
for(i=0; i<MAX; i++) {
scanf("%c", &niz[i].c);
scanf("%d", &niz[i].x);
}
n=f(niz);
for(int i=0; i<MAX; i++) {
printf("%d\n", niz[i].c);
printf("%d\n", niz[i].x);
}
printf("n = %d\n", n);
}
输出:
enter
2
2
2
niz[i].c = 2
i = 048
2
10
2
n = 2
答案 0 :(得分:2)
在第一次输入后按Enter键时,scanf
不会扫描换行符并保留在输入缓冲区中。当您尝试读取数字scanf
时,会看到换行符而不是数字,因此不扫描任何内容。
简单的解决方案是在格式前面添加一个前导空格:
scanf(" %c", &niz[i].c);
scanf(" %d", &niz[i].x);
/* ^ */
这告诉scanf
跳过空格。
答案 1 :(得分:1)
使用
niz[i].c = getchar();
而不是
scanf("%c", &niz[i].c);
或者,您可以使用其他更好的方法来获取在SO中讨论的char
输入,
现在,
您第二次看到提供的输入只有一次,这是因为在将2
作为第一个char
的输入后,您按下的 Enter 保留在输入缓冲区中,并且在第二次读取时迭代。
您输出10
,因为它是\r
的ASCII,输入。 不是数字,因此不能替换为'0'
。
答案 2 :(得分:1)
我正在看你的代码(我十年来没有使用控制台,但是)这里有一些见解:
尝试逐行追踪,如果以上几点无效,请注意不正确的变量变化
答案 3 :(得分:1)