我试图通过使用 strtok()分割来从c程序中输入字符串中的个别数字,如 1 2 3 4,5 6 7 8,9 10 11 12 强>功能。为此,我写了下面的编程,但它是读到第一个逗号,分隔符(注意:输入大小可能会有所不同。就像在给定的示例中逗号是在4位数之后,但它可以在k之后(5,6, 7等基于给出测试用例的数字。)
fgets(str,80,stdin);
/* read str with comma(,)delimiter */
token = strtok(str, ",");
/* walk through other tokens */
while( token != NULL )
{
// read token string with space delimiter
token2 = strtok(token, " ");
while( token2 != NULL )
{
printf("%s \n", token2);
token2 = strtok(NULL, " ");
}
token = strtok(NULL, ",");
}
答案 0 :(得分:0)
strtok
的实现适用于传递给它的最后一个非NULL的字符串。
因此,行:
token = strtok(NULL, ",");
不起作用。
如果您知道令牌的确切数量,则可以使用sscanf
。
/* read str with comma(,)delimiter */
token = strtok(str, ",");
/* walk through other tokens */
while( token != NULL )
{
int num1;
int num2;
int num3;
int num4;
if ( sscanf(token, "%d %d %d %d", &num1, &num2, &num3, &num4) != 4 )
{
// Problem.
}
else
{
// Use the numbers
}
token = strtok(NULL, ",");
}
答案 1 :(得分:0)
strtok
不可重入 - 您一次只能标记一个字符串。如果您想同时对多个字符串进行标记,请改用strtok_r
。更好的是,总是优先使用strtok_r
而不是strtok
,因为它的能力从来没有那么低:
char *inner, *outer;
fgets(str,80,stdin);
/* read str with comma(,)delimiter */
token = strtok_r(str, ",", &outer);
/* walk through other tokens */
while( token != NULL )
{
// read token string with space delimiter
token2 = strtok_r(token, " ", &inner);
while( token2 != NULL )
{
printf("%s \n", token2);
token2 = strtok_r(NULL, " ", &inner);
}
token = strtok_r(NULL, ",", &outer);
}
您可能还想调查strsep
。