我必须接受如下输入,并打印相同的内容(仅限句子):
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()只会打印第一句话。 提前谢谢。
答案 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
。