Strlen() 函数给出 "Segmentation Fault" 错误
Strlen() function giving "Segmentation Fault" error
所以这是我的代码:
int c;
char b[c];
scanf("%s",b);
c=strlen(b);
printf("\n");
printf("%s\n",b);
当我执行它时,它一直给我一个 "Segmentation Fault (core dumped)" 错误。我不想事先定义字符串大小。我希望程序在我写完字符串后确定它。
非常感谢所有帮助。
这个
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
。
所以这是我的代码:
int c;
char b[c];
scanf("%s",b);
c=strlen(b);
printf("\n");
printf("%s\n",b);
当我执行它时,它一直给我一个 "Segmentation Fault (core dumped)" 错误。我不想事先定义字符串大小。我希望程序在我写完字符串后确定它。
非常感谢所有帮助。
这个
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
。