字符串不按照分配方式打印

时间:2015-01-31 03:19:13

标签: c string

在下面的代码中,我的第一个输出回来了,我的第二个字符串与第三个字符串结合在一起。

#include <stdio.h>

int bandNumber;
char colorOne[];
char colorTwo[];
char colorThree[];

int main(void) {
    printf("How many bands??\n");
    scanf("%d",&bandNumber);
    if(bandNumber == 3) {
        printf("\n\nEnter your first band color: ");
        scanf("%s",colorOne);
        printf("\n\nEnter your second band color: ");
        scanf("%s",colorTwo);
        printf("\n\nEnter your third band color: ");
        scanf("%s",colorThree);
        printf("\n\nBand One: %s",colorOne);
        printf("\n\nBand Two: %s",colorTwo);
        printf("\n\nBand Three: %s\n\n",colorThree);
    }
}

任何人都可以解释错误以及我可以做些什么来纠正错误吗?

2 个答案:

答案 0 :(得分:2)

未检测到错误,因为编译器的警告未启用,被忽略或需要更好的编译器。此代码不为正在读取的数据分配空间。

最简单的解决方案:使用固定大小的数组并限制用户输入。

#include <stdio.h>

int main(void) {
    char colorOne[80+1];
    printf("How many bands??\n");
    ...
    printf("\n\nEnter your first band color: ");
    if (1 != scanf("%80s", colorOne)) Handle_EOForIOError();
    ...
    printf("\n\nBand One: %s",colorOne);
}

更强大的解决方案将使用fgets()。如果操作系统支持getline(),请考虑这一点。

int main(void) {
    char colorOne[80+1+1];
    printf("How many bands??\n");
    ...
    printf("\n\nEnter your first band color: ");
    if (fgets(colorOne, sizeof colorOne, stdin) == NULL) Handle_EOForIOError();

    // Delete potential ending \n
    size_t len = strlen(colorOne);
    if (len > 0 && colorOne[len-1] == '\n') colorOne[--len] = 0;
    ...
    printf("\n\nBand One: %s",colorOne);
}

练习defensive coding

答案 1 :(得分:1)

char colorOne[];

没有大小的数组只能用于此声明,如

char colorOne[] = "someString";

其他字符数组colorone无法计算数组的大小并存储扫描的字符串。所以这应该有初始化程序。

否则你可以拥有VLA(C99支持),如

int N;
scanf("%d",&N);
char colorOne[N];

始终存在动态内存分配

char *colorOne = malloc(sizeof(char) * N);