我得到了扫描10个数字的任务,以后将这些数字转换为字符。问题是,如果我不输入0,我不明白为什么会有一个无限循环。我用数组正确地完成了任务,但是我很感兴趣为什么在下面的示例中会发生这种情况。
#include <stdio.h>
#include <stdlib.h>
int main() {
/**
* for the example enter numbers: 8 5 12 12 15 23 15 18 12 4 -> helloworld
*/
char n;
// message needs to be 10 numbers long.
for (int i = 1; i <= 10; i++){
// enter message in numbers.
scanf("%d", &n);
// check if it is 0. if it is, end the message.
if(n == 0) {
printf("\nEnd of the message!");
break;
// if number is not 0, add 64 to transform to char.
}else {
n = n + 64;
// print the char.
printf("%c ", n);
// print the i, that doesn't increment.
printf(" -> i:%d\n", i);
}
}
return 0;
}
答案 0 :(得分:3)
您正在使用
char n;
...
scanf("%d", &n);
您不能将%d
与char
一起使用。您应将n
更改为int
或对%c
和scanf
使用printf
。
int n;
...
scanf("%d", &n);
OR
char n;
...
scanf("%c", &n);
答案 1 :(得分:1)
您正在使用char
来读取int
。 scanf
失败,输入保留在缓冲区中,因此scanf
不断读取相同的值,从而导致无限循环。
因此,将n
声明为int
。
优良作法是检查scanf
的返回值,以便您知道输入是否已正确读取。
如果在第一次转换(如果有)完成之前发生输入失败,scanf函数将返回宏EOF的值。否则,该函数将返回分配的输入项的数量,该数量可能少于所提供的数量,或者在出现早期匹配失败的情况下甚至为零
答案 2 :(得分:0)
问题出在扫描上!
scanf("%c", &n);
%d
表示整数,%c
表示字符,%s
表示字符串,%f
表示浮点数!
答案 3 :(得分:0)
scanf("%d", &n)
将 int 读入n。由于n是一个字符,因此导致3个字节出现在scanf覆盖n之后。在您的情况下,变量i
是在与这3个字节重叠的内存中分配的,因此对scanf
的每次调用都会修改变量i
,从而可能导致无限循环。使用%c
读取字符而不是%d
。