0

我需要编写一个程序,一次输入一行,输出有两个标记的行。假设输入不超过 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;
}
4

5 回答 5

3

做这个 -

number = sscanf(buff, "%s %s", token, token);
于 2012-06-27T04:58:48.067 回答
1

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

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

您只使用了 1 %s,因此它永远不会返回超过 1。无论如何,您已经在 while 条件内调用了 sscanf,无需在 while 主体内再次调用它。

于 2012-06-27T04:58:56.333 回答
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;
}
于 2012-06-27T06:09:50.347 回答
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;
}
于 2012-06-27T06:10:38.557 回答
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;
}
于 2012-06-27T06:25:01.137 回答