Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中用空字符拆分字符串_C - Fatal编程技术网

在C中用空字符拆分字符串

在C中用空字符拆分字符串,c,C,我正在读取一个文件,需要用空字符分割一个字符串 *Buff = "ABC \0 NAME \0 1231 \0 12.32"; Tok = strtok(Buff,'\0'); printf("Tok %s \n", Tok); 这不起作用,strtok不能接受空参数。您不需要strtok。只需继续使用strlen查找令牌的长度,并将其添加到指针+1中 正如Carl Norum指出的,您需要字符串的完整长度,因为\0不会告诉您字符串实际停止的位置。只需使用strlen(

我正在读取一个文件,需要用空字符分割一个字符串

    *Buff = "ABC \0 NAME \0 1231 \0 12.32";
    Tok = strtok(Buff,'\0');
    printf("Tok %s \n", Tok);

这不起作用,strtok不能接受空参数。

您不需要
strtok
。只需继续使用strlen查找令牌的长度,并将其添加到指针+1中

正如Carl Norum指出的,您需要字符串的完整长度,因为
\0
不会告诉您字符串实际停止的位置。

只需使用
strlen(字符串)+1
即可获得令牌:

例如:

Tok = Buff;
Tok += strlen(Tok) + 1;    // first token
Tok += strlen(Tok) + 1;    // second token
Tok += strlen(Tok) + 1;    // third token, etc.

终止条件是当
Tok>=Buff+sizeof“ABC\0 NAME\0 1231\0 12.32”

有一个很好的理由说明
strtok
不能使用
'\0'
分隔符:如果不知道字符串的完整长度,就无法解决此问题。否则,当您发现
'\0'
时,您不知道这是分隔符还是字符串已经结束。请注意,
strlen
不会有帮助-它会在发现第一个嵌入的
'\0'
后立即停止

除了这个“小”问题之外,您所需要做的就是发现令牌的开头:它们恰好是您以前发现的
'\0'
字符之后的一个字符。

您需要:

char Buff[] = "ABC \\0 NAME \\0 1231 \\0 12.32";
char delims[] = "\0"  ;
char *result = NULL;  
result = strtok( Buff, delims );
现在,您可以简单地迭代“result”,直到得到NULL,即找到所有字符串


干杯

我觉得
*Buff=
很可疑。请发布更完整的代码。另外,请问一个问题。C字符串以null结尾。您的字符串在结尾以外的地方包含空字符,这意味着您没有使用C字符串,而
string.h
函数也不会有多大帮助。你需要自己动手。我看不到任何文件的读取。顺便说一句,strtok()的scond参数应该是字符指针,而不是整型文字。只要知道何时停止,该算法就可以正常工作。@user2015858我建议使用另一种终止条件:双零终止(一种非常常见的变体)。如果代码fins一个长度为零的令牌,则到达缓冲区的末尾并停止令牌化。您不必依赖sizeof操作(它有时不会带来您所期望的结果),只需在字符串终止后添加另一个\0,即可在运行时判断令牌的总长度。