这个问题在这里已有答案:
我想创建和操作一个字符数组。我不想使用字符串。这是我用C语言编写的代码:
int main(int argc, char *argv[]) {
char s[4];
int i;
for(i = 0; i < 4; i++){
printf("Character at %d : ",i);
scanf("%c",&s[i]);
printf("%c",s[i]);
}
return 0;
}
当我执行它时,似乎:
i
的元素跳转到i+2
的元素我想了解scanf("%c",&s[i]);
有什么问题,我认为这是导致这段代码出现问题的指令。
scanf()
不能按预期工作。 scanf()
还会将您按下的输入视为一个角色。如果您坚持使用scanf()
,这里有一些解决方法可用于您当前的代码。
方法1
int main(int argc, char *argv[]) {
char s[4];
char enter;
int i;
for(i = 0; i < 4; i++) {
printf("Character at %d : ",i);
scanf("%c", &s[i]);
scanf("%c", &enter);
printf("%c \n", s[i]);
}
return 0;
}
方法2
使用相同的代码,但一次输入所有四个字符。
int main(int argc, char *argv[]) {
char s[4];
int i;
for(i = 0; i < 4; i++) {
printf("Character at %d : ",i);
scanf("%c", &s[i]);
}
for(i = 0; i < 4; i++) {
printf("\n %c", s[i]);
}
return 0;
}
输出如下:
字符0:abcd 字符1:字符2:字符3: 一个 b C d
方法3
正如Xing在评论中所提到的,这看起来更好地实现了它。但请务必注意%c
中scanf()
之前添加的空格。
int main(int argc, char *argv[]) {
char s[4];
int i;
for(i = 0; i < 4; i++) {
printf("Character at %d : ",i);
scanf(" %c", &s[i]); // Note the whitespace before %c
printf("\n %c", s[i]);
}
return 0;
}
它没有像你期望的那样工作,因为scanf()
只占用一个字符,但只有你按下回车才会这样做。因此,输入字符仍然在缓冲区中,并由scanf()
的下一次迭代读取。
有关如何更改代码的建议,请参阅How to clear input buffer in C?。