2023-12-20 22:09来源:m.sf1369.com作者:宇宇
不是当程序读不到字符串了就EOF了。是这样的,当程序读不到字符串了,才会判断读取状态,之后才将读取状态变为EOF
While read one line != EOF
Linenum ++
比如这个循环到最后一行,最后一行读取成功,linenum++,读取状态为读到数据,继续运行程序,这时没有读到数据,但是当前读取状态还不是eof,所以继续运行linenum++,读取状态变为EOF,这时再读取数据,程序结束。所以,这个循环来计算行数,最后会多一行。其实就是一句话,当首次没有读到数据后,读取状态还是有读的,之后再操作一次读取状态才变为EOF。
建议用读取到的数据是否为NULL来判断读取是否结束。
空格处填上'\0',其ASCII码的值为0,这是字符串结束符。
以下内容摘自网络。
对字符数组,有以下几种定义方法:
1) char str[]=12345;
或给字符串加上大括号:char str[]={12345};
这种方法定义时,系统会自动在字符串的末尾加上字符串结束符,即 ‘\0’,
2) char str[10]={'1','2','3','4','5'};
这种方法定义时,系统会自动从未初始化的元素开始,将之后的元素赋为\0,如上面的数组str中的元素实际上是:'1','2','3','4','5','\0','\0','\0','\0','\0'
3) char str[]={'1','2','3','4','5'};
这种方法定义时,系统不会自动在字符串的末尾加上字符串结束符;
此时用sizeof()函数可以正确求出其所占的内存大小;但用strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的。
所以,采用该方法定义时,一般人为地加上\0,即char str[]={'1','2','3','4','5', '\0'};
1、char a[]={abcd}相当于一串字符(含5个字符),char a[]={'a','b','c','d'}是字符数组,数组不可以不加大括号。
2、char a[]=“abcd”方括号中合法长度应该是5因为包含了5个字符,char a[]={'a','b','c','d'}合法的是4。
3、不需要。char a[]=“abcd”含5个字符(a b c d \0),C语言编译器会自动把\0加上去;而char a[]={'a','b','c','d'}数组有大小不需要结束符。
这三个问题本质来讲是一样的,char a[]={abcd}是字符串,包含\0;char a[]={'a','b','c','d'}是字符数组,数组有大小不需要结束符。(PS:要是学艺不精,请多多包涵)
没法输入
不过有个替代的方法,Ctrl+Z,虽然并不是EOF
但是scanf检测到这个符号,会自动返回EOF
注意getchar之类没法检测到
这个问题我是这样想的
首先你必须理解什么是转义字符,\ddd是八进制所代表的的字符你编译器是这样的它会自动判断\0后面是不是数字,八进制的还要判断是不是小于八,若小于则\ddd是八进制所代表的的字符,若不是,则\0为结束的标志!
我编译的时候,有错误你把最后一个4删除掉!
你的输出结果不对:第一个是:abcd 删除4后的结果:第二个是:abcdS