在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,即可在运行时判断令牌的总长度。