while 内部的 Scanf 函数只运行一次?

Scanf function inside of while runs only one time?

为什么我的 scanf 只运行一次就在里面运行?

#include<stdio.h>
#include<stdlib.h>

int main()

{

char s[9999];

while(scanf("%[^\n]s",s)>0)

{ 
    
    int count=0, prev=0; 
    for (int i=0;i<strlen(s);i++)
{
if(s[i]==' ')
{
count=i-prev;
prev=i+1;
printf("%c", (char) (96+count));
}
else if(strlen(s)-1==i)
{
count=i-prev+1; printf("%c", (char) (96+count)); }
} 
printf(" ");
}}

我的测试用例和输出:

输入被认为是最大长度为 1000 的字符串

此处,在第一次迭代期间,s 存储第一行,并在第二次迭代时 s 读取 \n。由于我使用了%[^\n]scanf将停止扫描。

现在这里,扫描的元素个数为零。所以 while 循环条件失败了。因此,循环仅迭代一行。

我们可以将条件更改为:

while(scanf("%[^\n]\n",s)>0)

这将跳过扫描 \n,并打印所需的输出。

除非您了解 scanf,否则不应使用它。懂了scanf就不会用了。

有几个问题
while(scanf("%[^\n]s",s)>0)

scanf 将读取输入流,将字符写入变量 s 直到它看到换行符。然后它将尝试匹配输入流中的文字 s 。显然,下一个字符不是 s(它是换行符),因此格式字符串中的 s 不匹配。 (这不是一个真正的问题,但当 s 肯定不存在时,您要求 scanf 匹配文字 s 肯定很奇怪。如果您尝试使用类似 "%[^\n]s%d",你可能会疑惑为什么 scanf 从不匹配整数。这是因为 scanf 在输入流与格式字符串不匹配时立即停止扫描,而 s 在格式字符串中将不匹配。)在循环的第二次迭代中,第一个字符 scanf 看到的是换行符,因此它不进行任何转换并且 returns 0。如果你想丢弃该换行符并且可以删除前导空格,您可以简单地使用 " %[\n]" 作为转换说明符。如果您不想丢弃前导空格,可以使用 " %[\n]%*c" 丢弃换行符 请注意,您确实应该防止覆盖 s,因此您应该使用:

while(scanf(" %9998[^\n]", s) > 0)

while(scanf("%9998[^\n]%*c", s) > 0)