谁能告诉我这段代码有什么问题?
for(int i=0;i<4;i++)
{
long int a = strtol(strtok("1-2-3-4","-"),(char**)NULL,10);
cout << a <<endl
}
我在 Solaris Unix 上运行。它给了我一个分段错误。
故障在strtol()
.
问题很多。
我希望核心转储是因为字符串"1-2-3-4"
存储在只读内存中,所以当strtok()
修改它(以隔离第一个令牌)时,程序崩溃。你说崩溃在strtol()
;这表明 from 的返回值为strtok()
NULL。
第一次调用strtok()
使用字符串作为参数;第二个调用在其位置传递 NULL 以指示“从上次中断的地方继续”。如所写,如果字符串是可修改的,那么您将解析1
四次。
这更接近正确(尽管未经测试):
char input[] = "1-2-3-4";
char *data = input;
for (int i = 0; i < 4; i++)
{
char *token = strtok(data, "-");
if (token != 0)
{
long int a = strtol(token, NULL, 10);
cout << a << endl;
}
data = NULL;
}
通常,您需要从strtol()
;进行错误检测。此外,这样做非常令人担忧。但是,使用示例字符串,您不必担心这一点。
错误在于strtok
调用,而不是strtol
. 您不能调用strtok
字符串文字,因为它会尝试修改字符串。修改字符串文字会导致 C++ 中出现未定义的行为。
由于问题已经讨论过了,我想展示另一种方法:
#include <stdio.h>
#include <string.h>
int main ()
{
long int a;
char str[] ="1-2-3-4";
char * pch;
pch = strtok (str,"-");
while (pch != NULL)
{
a = strtol(pch,(char**)NULL,10);
cout << a <<endl;
pch = strtok (NULL, "-");
}
return 0;
}