strtok() 读取字符串末尾的空格并且不返回 NULL

strtok() reading the spaces at the end of string and not returning NULL

我正在使用 fgets() 读取一行,其中包含由 spaces 分隔的整数值,如下所示:

while(fgets(str, sizeof(str), stdin) != NULL)

读取 str 中的字符串后,我使用 strtok() 将字符串转换为标记,然后使用 atoi() 函数将这些值转换为整数。

token = strtok(str, s);
while( token != NULL)    //If token is NULL then don't convert it to integer
int d = atoi(token);

第一个输入的输出符合预期。

输入-1:

5 1 0 3 4\n

输出-1:

d=5
d=1
d=0
d=3
d=4

现在,当我在字符串后输入 space 并按回车键时,问题就出现了。

输入-2:

5 1 0 3 4 \n

输出 2:

d=5
d=1
d=0
d=3
d=4
d=0

所以现在我的问题是:

1.当最后只有space时,strtok()不会returnNULL吗?

2.如何区分输出中的两个零?

3. 我怎样才能避免 strtok() 阅读最后的 space 或最后的任意数量的 space?

您的问题与定界符有关。 一个解决全部你的问题是:

请将 space [ ] 和换行符 [\n] 添加到您的分隔符字符串中,并可选择 \t.

根据 strtok()

man page

char *strtok(char *str, const char *delim);

The delim argument specifies a set of bytes that delimit the tokens in the parsed string.

A sequence of two or more contiguous delimiter bytes in the parsed string is considered to be a single delimiter.

所以,您可以使用

char *s = " \n\t"

然后

token = strtok(str, s);

您使用的函数不是correct.Delimiter作为第二个参数传递的应该是正确的。

token = strtok(str," \n\t");  //should use delimiter
while( token != NULL) 
{
   int d = atoi(token);
   printf("%d\n",d);
   token = strtok(NULL," \n\t");
}

strtok 的签名是 char *strtok(c​​har *str, const char *delim);

分隔符可以是 space [ ]、换行符 \n、逗号 []、制表符 [\t] 以恒定有效方式分隔字符串中两个值的任何内容都被视为分隔符。 strtok 忽略字符串开头或结尾的分隔符。

您可以使用 n 个分隔符。根据您的字符串,您可以使用两个定界符 1. space [ ] 2.\n

变化:

1.token = strtok(str, "\n"); 2.token = strtok(NULL,"\n");