首页 > 解决方案 > while 内的 Scanf 函数只运行一次?

问题描述

为什么我的 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 的字符串

标签: cstringwhile-loopscanf

解决方案


除非你明白scanf,否则你不应该使用它。懂scanf了就不会用了。有几个问题

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

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

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

或者

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

推荐阅读