如何在C中逐个输入字符串

时间:2014-03-19 09:17:17

标签: c regex fgets

我必须接受如下输入,并打印相同的内容(仅限句子):

2

I can't believe this is a sentence.

aarghhh... i don't see this getting printed.

数字2显示了要遵循的行数(此后为2行)。 我使用了所有选项scanf和fgets,使用了各种正则表达式。

int main() {
  int t;
  char str[200];
  scanf ("%d", &t);      
  while (t > 0){
  /* 
  Tried below three, but not getting appropriate outputs
  The output from the printf(), should have been:

  I can't believe this is a sentence.
  aarghhh... i don't see this getting printed.
  */
    scanf ("%[^\n]", str);
    //scanf("%200[0-9a-zA-Z ]s", str);
    //fgets(str, 200, stdin);
    printf ("%s\n", str);
    t--;
  }
}

对不起,我搜索过所有相关帖子,但我找不到任何答案: 所有版本的scanf()都不会产生任何结果,而fgets()只会打印第一句话。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

您应该使用fgets()。请记住它会保留换行符,因此您可能希望在阅读该行后手动删除它:

if(scanf("%d", &t) == 1)
{
  while(t > 0)
  {
    if(fgets(str, sizeof str, stdin) != NULL)
    {
      const size_t len = strlen(str);
      str[len - 1] = '\0';
      printf("You said '%s'\n", str);
      --t;
    }
    else
      printf("Read failed, weird.\n");
  }
}

答案 1 :(得分:0)

为了方便起见,我们说输入是" 2 \ none \ ntwo \ n"。

启动程序时,在第一个scanf()输入缓冲区包含所有内容并指向开头之前

2\none\ntwo
^

在第一个scanf()之后," 2"消耗离开输入缓冲区

2\none\ntwo
 ^^

现在你尝试读取除换行符之外的所有内容......但缓冲区中的第一件事是换行符,因此无法读取任何内容。

建议:始终使用fgets()来读取实线,然后按照您认为更好的方式解析输入。

答案 2 :(得分:0)

要在C中使用正则表达式,您必须包含regex.h。在这种情况下,您不需要正则表达式。如果您有"%[^\n]",请将其替换为"%s"。请确保包含stdio.h