\0不是读入的,是程序自动加上的,表示一个串或一个行读取完成的结束位置,你只需要处理\0之前的数据,到\0就不要继续处理了。这个结束符总要占用一个字节的内存位置.对于二进制文件用fread读取,就不需要为这个\0预留位置了
多出来的是换行符.你可以改成while(scanf("%c",&str)&&str!='\n')这样遇到换行符结束程序.否则读到换行符并输出是正常的.或者可以限制输出只有大写的时候if(str>='A'&&str<='Z')printf(...)