我想创建和操纵一系列角色。我不想使用字符串。 这是我的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]);
的问题所在,我认为这是指令所致导致此代码中的问题。
答案 0 :(得分:3)
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;
}
答案 1 :(得分:1)
它不能按您预期的那样工作,因为scanf()
仅包含一个字符,但是只有在您按Enter键之前,它才会这样做。因此,回车符仍然在缓冲区中,并由scanf()
的下一次迭代读取。
有关如何更改代码的建议,请参见How to clear input buffer in C?。