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

C 字符串不会按照其分配方式打印,c,string,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) { print

在下面的代码中,我的第一个输出返回第二个字符串和第三个字符串

#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);
    }
}
#包括
整数带数;
炭色酮[];
char-colorTwo[];
三种颜色[];
内部主(空){
printf(“有多少条带?”\n”);
scanf(“%d”、&bandNumber);
如果(带数==3){
printf(“\n\n输入您的第一个波段颜色:”;
扫描频率(“%s”,彩色);
printf(“\n\n输入第二个波段颜色:”);
扫描频率(“%s”,彩色二);
printf(“\n\n输入第三个色带颜色:”);
扫描频率(“%s”,彩色三);
printf(“\n\n带一个:%s”,彩色一个);
printf(“\n\n带两个:%s”,颜色二);
printf(“\n\n带三个:%s\n\n”,彩色三个);
}
}
有人能解释这些错误吗?我能做些什么来纠正它们

char colorOne[];
不带大小的数组只能与此声明一起使用,如

char colorOne[] = "someString";
Else char array
colorone
无法计算数组的大小并存储扫描的字符串。所以这应该有初始值设定项

否则,您可以使用VLA(由C99支持),如

而且总是有动态内存分配

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

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

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

#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);
}

练习

char colorOne[]。您确定您的代码编译时没有错误吗?编译器会显示警告。声明无限制字符串的更好方法是什么?代码不能“声明无限制字符串”。代码可以声明指向char的指针。它是有效的声明,即使不是定义。链接器应该抱怨缺少符号。
#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);
}
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);
}