无法将字符放在C中的字符数组中

时间:2019-02-21 14:10:22

标签: c arrays char scanf

我想创建和操纵一系列角色。我不想使用字符串。 这是我的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]);的问题所在,我认为这是指令所致导致此代码中的问题。

2 个答案:

答案 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在评论中提到的,这看起来是实现它的更好方法。但是请确保注意在%cscanf()之前添加的空格。

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?