【发布时间】:2018-08-29 20:46:33
【问题描述】:
我正在使用一小段代码来测试大型(初学者)程序的功能,但在显示我从字符串中提取的令牌时遇到问题。
我找到并使用了:
#include <stdio.h>
#include <string.h>
int main()
{
char *string, *found;
string = strdup ("1/2/3");
printf("Original string: '%s'\n",string);
while ((found = strsep(&string,"/")) != NULL )
printf ("%s\n",found);
return (0);
}
这很好用,将标记一次打印为字符串。
然后当我尝试移动到用户输入的字符串时:
#include <stdio.h>
#include <string.h>
int main()
{
char string[13];
char *found, *cp = string;
fprintf(stderr, "\nEnter string: ");
scanf("%12s",string);
printf("Original string: '%s'\n",string);
while((found = strsep(&cp,"/,-")) != NULL )
printf("Test 1"); /*To pinpoint where the seg fault arises*/
printf("%s\n",found);
return(0);
}
我在printf("%s\n",found); 线上遇到了段错误。我掌握了指针、数组和字符串的基础知识,但显然我遗漏了一些东西,希望有人能告诉我它是什么!
另外 - 如果我更改 printf("%s\n",found); 的参数,例如到printf("%i\n",found); 我得到了一些随机性返回,但总是正确的数量,例如如果我输入1/2/3 我会得到三行垃圾,输入1111/2222 会得到两行。我尝试了 %c, %i, %d, %p,它们都做同样的事情,但是 %s 段错误。
我完全被难住了。
【问题讨论】:
-
现在您知道为什么有很多很多 C 程序员总是在
if、while和for语句之后的代码周围加上大括号。以实际上有助于防止错误的方式编写代码比在将它们放入代码后找到它们更容易 - 因为如果你知道你正在编写有错误的代码,你就不会这样做。