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(char *str, const char *delim);
分隔符可以是 space [ ]、换行符 \n、逗号 []、制表符 [\t] 以恒定有效方式分隔字符串中两个值的任何内容都被视为分隔符。
strtok 忽略字符串开头或结尾的分隔符。
您可以使用 n 个分隔符。根据您的字符串,您可以使用两个定界符
1. space [ ]
2.\n
变化:
1.token = strtok(str, "\n");
2.token = strtok(NULL,"\n");
我正在使用 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()
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(char *str, const char *delim);
分隔符可以是 space [ ]、换行符 \n、逗号 []、制表符 [\t] 以恒定有效方式分隔字符串中两个值的任何内容都被视为分隔符。 strtok 忽略字符串开头或结尾的分隔符。
您可以使用 n 个分隔符。根据您的字符串,您可以使用两个定界符 1. space [ ] 2.\n
变化:
1.token = strtok(str, "\n"); 2.token = strtok(NULL,"\n");