在下面的代码中,我的第一个输出回来了,我的第二个字符串与第三个字符串结合在一起。
#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);
}
}
任何人都可以解释错误以及我可以做些什么来纠正错误吗?
答案 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);
}
答案 1 :(得分:1)
char colorOne[];
没有大小的数组只能用于此声明,如
char colorOne[] = "someString";
其他字符数组colorone
无法计算数组的大小并存储扫描的字符串。所以这应该有初始化程序。
否则你可以拥有VLA(C99支持),如
int N;
scanf("%d",&N);
char colorOne[N];
始终存在动态内存分配
char *colorOne = malloc(sizeof(char) * N);