问题描述
我在C语言中有这段代码,我将在其中输入一串用空格分隔的数字,然后用strsep
对其进行分割。如果我输入了"1 2"
之类的字符串,并将strcmp
设置为在最后一个元素之前寻找数字,则代码有效,但是如果我将strcmp
设置为在最后一个元素之前寻找数字,代码失败。您能提出任何建议吗?
char *string = malloc(1028),*found;
if (fgets(string,1028,stdin) != NULL) {
while ((found = strsep(&string," ")) != NULL) {
if (strcmp(found,"2") == 0) {
printf("%s\n",found);
}
}
}
解决方法
这是因为found
指向的最后一个元素包括换行符。因此,您必须像这样将新行添加到strcmp
:strcmp(found,"2\n")
(假设2是您的最后一个元素),或者当您调用strsep
时,您需要在两个空格上进行标记和换行符:strsep(&string," \n")
。
完整的解决方案:
char *string = malloc(1028);
if (string) {
if (fgets(string,1028,stdin) != NULL) {
char *p = string,*found = string;
while ((found = strsep(&p," \n")) != NULL) {
if (strcmp(found,"1") == 0) {
printf("%s\n",found);
}
}
}
free(string);
}
要观察的几件事:string
指针已由strsep
函数修改,因此我已更新代码以使用中间变量p
。我还更新了代码以验证分配是否成功,然后在最后释放它。根据您的系统要求,您可以考虑放弃堆并在堆栈上分配string
。