不知道为什么使用scanf时while循环的工作方式不同
我是学习C的新手,据我所知,如果有人给出诸如不知道为什么使用scanf时while循环的工作方式不同,c,C,我是学习C的新手,据我所知,如果有人给出诸如while(1==1)之类的条件,while循环将永远运行 但在阅读一本书时,我注意到一个代码,如 #include<stdio.h> int main() { char a; int started = 0; puts("Scanning\n"); while (scanf("%s[^\n]",&a) == 1) { if (a >= 65 && a
while(1==1)
之类的条件,while循环将永远运行
但在阅读一本书时,我注意到一个代码,如
#include<stdio.h>
int main() {
char a;
int started = 0;
puts("Scanning\n");
while (scanf("%s[^\n]",&a) == 1)
{
if (a >= 65 && a <= 90)
{
printf("Char is capital\n");
}
else
{
printf("Not cap.\n");
}
}
puts("Done\n");
return 0;
}
#包括
int main(){
字符a;
int=0;
放入(“扫描”\n);
而(scanf(“%s[^\n]”,&a)==1)
{
如果(a>=65&&achar.exe
它从stdin获取输入,但scanf返回参数的数目,即1,因此当(1==1)
但为什么这不是一个永久循环,而是在读取文件后存在
感谢您的光临
char a;
...
while (scanf("%s[^\n]",&a) == 1)
您的格式无效,因为它专用于字符串,而您只想读取一个字符,因此您将至少为结尾的null字符写出该字符,从而产生未定义的行为
做
请注意格式中的空格,如果要管理所有字符,请将其删除
在
如果(a>=65&&a='a'&&a
但为什么这不是一个永久循环,而是在读取文件后存在
只有scanf
每次调用时返回1,它才会无限期地循环。循环在函数第一次返回不同结果时终止*
scanf
的返回值传递成功扫描和分配的输入字段数,在某些情况下还传递有关I/O错误的信息。scanf
将返回宏EOF
的值,如果它在匹配任何字段之前到达输入的末尾。EOF
不等于1
*前提是程序的行为定义良好。由于注释和另一个答案中描述的原因,您的程序的行为没有定义好。函数scanf返回以下值:
>0
成功转换和分配的项目数
- 0-未分配任何项目
&a
表示试图读取堆栈变量中的整行
但为什么这不是一个永久循环,而是在读取文件后存在
尝试读取堆栈变量中的文件将导致堆栈崩溃,程序将崩溃
在internet上的C中查找不同的存储类型和内存管理。a
是分配在程序堆栈上的字符变量,假设只存储一个字符。如果您获取它的地址并尝试放置更多数据,它将损坏相邻的堆栈内存/变量,直到操作系统检测到并终止您的程序。您的format表示它将读取整行,即直到新行。
scanf
仍将返回1,但它将尝试将该行存储在a
的地址中
您是否像这样运行它:
cat <your file>| ./a.out
注意现在a
现在是一个数组,前面不需要&
。当文件完成时,循环仍将退出,但处于EOF。如果新行直到4Kb才出现,最坏的情况是尝试使用小于4Kb的文件
阅读更大文件/行的规定似乎超出了您的实验范围
工作代码
#include<stdio.h>
int main() {
char a[4096];
int started = 0;
puts("Scanning\n");
while (scanf("%s[^\n]", a) == 1)
{
if (a >= 65 && a <= 90)
{
printf("Char is capital\n");
}
else
{
printf("Not cap.\n");
}
}
puts("Done\n");
return 0;
}
#包括
int main(){
chara[4096];
int=0;
放入(“扫描”\n);
而(scanf(“%s[^\n]”,a)==1)
{
如果输入字母时(a>=65&&a,则条件(1==1)
变为真,循环时的主体被迭代
在迭代while
循环之后,它将进入下一个字母。scanf
等待您输入下一个字符
再次满足条件(1==1)
这个循环是一个不确定的循环,你可以继续输入字母,你永远不会到达puts
语句。什么是a
?你应该充实发布的代码,这样它就是一个读取循环。它可以返回的不仅仅是arg count如果你将a
与整数进行比较,我假定它是整数。T当向其中读取字符串时,肯定不起作用。无论是在循环内还是循环外。将scanf(“%s[^\n]”,&a)
替换为scanf(“%c”,&a)
(注意格式中的空格),也将65替换为“a”,将90替换为“Z”,您可以使用isupper()
测试字符是否为大写,而不是使用那些神奇的数字。所有这些都是绝对正确的,但对实际提出的问题没有反应。
if (a >= 'A' && a <= 'Z')
cat <your file>| ./a.out
while(scanf("%s[^\n]", a) == 1)
#include<stdio.h>
int main() {
char a[4096];
int started = 0;
puts("Scanning\n");
while (scanf("%s[^\n]", a) == 1)
{
if (a >= 65 && a <= 90)
{
printf("Char is capital\n");
}
else
{
printf("Not cap.\n");
}
}
puts("Done\n");
return 0;
}