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)
为什么我的 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)