使用sscanf()从一行只输出2个令牌

时间:2012-06-27 04:48:32

标签: c scanf

我需要编写一个程序,一次接收输入行,并输出只有两个标记的行。假设输入不超过50个字节。我使用fgets一次捕获一行并使用sscanf一次抓取令牌并查看它是否返回2.但是,它似乎不起作用。有人可以建议怎么做吗?

#include <stdio.h>

int main(void)
{
    char buff[50];
    char token[50];
    int number;

    while (fgets(buff, sizeof(buff), stdin) != NULL)
    {
        while ((number = sscanf(buff, "%s", token)) != EOF)
        {
            number = sscanf(buff, "%s", token);
            if (number == 2)
            {
                printf("%s\t", token);
            }
        }
    }
    return 0;
}

5 个答案:

答案 0 :(得分:3)

这样做 -

number = sscanf(buff, "%s %s", token, token);

答案 1 :(得分:1)

来自http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

“s:字符串。这将读取后续字符,直到找到空格(空白字符被视为空白,换行符和制表符)。”

你只使用1%s,所以它永远不会超过1.无论如何,你已经在while条件下调用sscanf,不需要在while体内再次调用它。

答案 2 :(得分:1)

我不会使用scanf来摆脱你的问题。您可以使用strtok中定义的string.h函数。所以,你的问题的答案可能是:

#include <stdio.h>
#include <string.h>

int main(void) {
    char buff[50];
    char *token;
    int number=0;

    while (fgets(buff, sizeof(buff), stdin) != NULL) {

        if((token = strtok (buff, " ")) != NULL) {
            ++number;
            while ((token = strtok (NULL, " ")) != NULL)
                ++number;
        }
        if(number == 2)
            printf("Current line has two tokens\n");
        else printf("current line has %d tokens\n", number);

        number=0;
    }
    return 0;
}

答案 3 :(得分:0)

请试试这个

#include <stdio.h>

int main(void)
{
char buff[50];
char token1[50], token2[50];

while (fgets(buff, sizeof(buff), stdin) != NULL)
{
    if( sscanf(buff, "%s %s", token1, token2) == 2 )
    {
        printf("%s ", buff);
    }
}
   return 0;
}

答案 4 :(得分:0)

这有效..

#include <stdio.h>

int main(void)
{
    char buff[50];
    char token1[50];
    char token2[50];
    char token3[50];

    while (fgets(buff, sizeof(buff), stdin) != NULL)
    {

        if (sscanf(buff, "%s%s%s", token1, token2, token3) == 2)
        {
            printf("%s %s\n", token1, token2);
        }
    }
    return 0;
}