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