[英]strtok() reading the spaces at the end of string and not returning NULL
我正在使用fgets()
读取一行,该行包含以空格分隔的整数值,如下所示:
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
现在,当我在字符串后加空格并按Enter键时,就会出现问题。
输入2:
5 1 0 3 4 \n
输出2:
d=5
d=1
d=0
d=3
d=4
d=0
所以现在我的问题是:
1.当末尾只有空格时, strtok()
不会返回NULL吗?
2.如何区分输出中出现的两个零?
3.如何避免strtok()
读取最后一个空格或末尾的任意数量的空格?
您的问题出在定界符上。 解决所有问题的一种方法是:
请加空格[ ]和换行符[
\\n
]都输入分隔符字符串,也可以选择\\t
。
按照strtok()
的手册页
char * strtok(char * str,const char * delim);
delim参数指定一组字节,这些字节定界已分析字符串中的标记。
和
解析的字符串中两个或多个连续的定界符字节的序列被视为单个定界符。
因此,您可以使用
char *s = " \n\t"
接着
token = strtok(str, s);
您使用的功能不正确。作为第二个参数传递的分隔符应该正确。
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);
分隔符可以是空格[],换行符\\ n,逗号[,],制表符[\\ t],以恒定的有效方式将字符串中的两个值分开的任何内容都被视为分隔符。 strtok将忽略字符串开头或结尾的分隔符。
您可以使用n个分隔符。 根据您的字符串,您可以使用两个定界符1.空格[] 2. \\ n
更改:
1.token = strtok(str,“ \\ n”); 2.token = strtok(NULL,“ \\ n”);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.