不能将字符放在C中的字符数组中[重复]

问题描述 投票:-1回答:2

这个问题在这里已有答案:

我想创建和操作一个字符数组。我不想使用字符串。这是我用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]);有什么问题,我认为这是导致这段代码出现问题的指令。

c arrays char scanf
2个回答
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
投票

它没有像你期望的那样工作,因为scanf()只占用一个字符,但只有你按下回车才会这样做。因此,输入字符仍然在缓冲区中,并由scanf()的下一次迭代读取。

有关如何更改代码的建议,请参阅How to clear input buffer in C?

© www.soinside.com 2019 - 2024. All rights reserved.