【发布时间】:2017-05-29 18:13:28
【问题描述】:
这是我的代码:
int c;
char b[c];
scanf("%s",b);
c=strlen(b);
printf("\n");
printf("%s\n",b);
当我执行它时,它一直给我一个“分段错误(核心转储)”错误。我不想事先定义字符串大小。我希望程序在我写完字符串后确定它。
非常感谢所有帮助。
【问题讨论】:
这是我的代码:
int c;
char b[c];
scanf("%s",b);
c=strlen(b);
printf("\n");
printf("%s\n",b);
当我执行它时,它一直给我一个“分段错误(核心转储)”错误。我不想事先定义字符串大小。我希望程序在我写完字符串后确定它。
非常感谢所有帮助。
【问题讨论】:
这个
int c;
char b[c];
给你未定义的行为,因为c 未初始化,但随后用作b 的数组大小。未定义的行为意味着之后可能会发生任何事情,包括运行一段时间正常,然后稍后进行核心转储。
听起来你想要的是从输入中确定字符串长度,但你不能用 C 中的数组来做到这一点,因为数组大小是恒定的,在声明数组时确定。相反,您需要使用动态分配的缓冲区,当您读取字符串时,您可以根据需要调整其大小。如果您使用的是 POSIX,则可以让 stdio 库在您的 scanf 调用中使用 m 修饰符为您执行此操作:
char *b;
if (scanf("%ms", &b) > 0) {
printf("%s\n", b);
free(b); }
如果您不使用 POSIX C,则需要先分配一个比可能需要的缓冲区更大的缓冲区(然后可以选择调整它的大小),或者根本不使用 scanf。
【讨论】: