c - 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 的字符串
解决方案
除非你明白scanf
,否则你不应该使用它。懂scanf
了就不会用了。有几个问题
while(scanf("%[^\n]s",s)>0)
scanf 将读取输入流,将字符写入变量s
,直到看到换行符。然后它将尝试匹配s
输入流中的文字。显然,下一个字符不是 an s
(它是换行符),因此s
格式字符串中的 不匹配。(这不是一个真正的问题,但是s
当 ans
肯定不存在时,您要求 scanf 匹配文字肯定很奇怪。如果您尝试使用类似的东西进行进一步匹配"%[^\n]s%d"
,您可能会困惑为什么scanf
从不匹配 an整数。这是因为scanf
一旦输入流与格式字符串不匹配就停止扫描,并且s
格式字符串中的 不会匹配。)在循环的第二次迭代中,第一个字符scanf
sees 是那个换行符,所以它不进行任何转换并返回 0。如果您想丢弃该换行符并且可以删除前导空格,您可以简单地" %[\n]"
用作转换说明符。如果你不想丢弃前导空格,你可以丢弃换行符," %[\n]%*c"
注意你真的应该防止覆盖s
,所以你应该使用:
while(scanf(" %9998[^\n]", s) > 0)
或者
while(scanf("%9998[^\n]%*c", s) > 0)
推荐阅读
- r - 基于参考列添加列(外汇汇率,R laguage)
- amazon-web-services - 部署代码后如何在另一个 Auto Scaling 组上重启 Varnish 服务
- java - 是否可以使用 Python 后端和 Android/Native 应用程序作为前端
- python - 为什么我得到高 MAE(平均绝对误差)和 MSE(均方误差)与 MAPE(平均绝对百分比误差)相比?
- asp.net-core-webapi - SimpleInjector MVC 包和 Web API
- xamarin - 无法使用 NavigationPage 动画 Xamarin 表单
- syntax - erlang REPL定义范围错误:无法执行函数
- list - 颤振 - 如何将列表中的值定位到向上?
- python-3.x - 为什么我无法在我的 Jupyter Notebook (Python 3.6) 中导入 utils,尽管它已安装?
- python - TypeError:需要一个类似字节的对象,而不是'int' python3