简单LinuxC程序关于实现从终端获取一条语句并统计各种字符数量(字符输入输出)
2017-07-12 19:38
302 查看
实现从终端获取一条语句,计算这条语句中的空格、字母、数字的个数,统计这条语句全部字符的数量,实现多次输入,并统计一共输入的字符的数量。
源代码如下:
本题并不是很难,但在这里,我想要讨论一下关于字符的输入。要实现输入一串字符,我们常用的方法有使用scanf()读取一个字符串、使用gets()或fgets()读取一个字符串等。而这些方法都或多或少有一些缺点。使用scanf()读取一个字符串,会出现无法读取空格字符的问题,scanf()默认遇到空格就到了下一次读取。使用gets()则有风险,gets()从标准输入设备读字符串函数时会无限读取,不会判断上限,以回车结束读取,所以可能发生溢出。此外,前面介绍的方法都需要先定义一个字符数组,这就要求限定长度,而我们的输入可能很长,程序就存在漏洞,可能发生非法访问内存的问题。
根据本题的题意,适合的方法是循环从标准输入读取一个字符,并将它打印到屏幕上。使用ch = getchar();可以做到这一点,另外,scanf("%c",&ch);的功能也是一样。我们在完成问题时,需要灵活使用各种方法,千万不能被固有思想束缚。
不过今天在玩输入输出时,碰到一个问题。代码如下:
当我输入的字符数量超过10个时,printf依旧能将字符全部输出,多余的字符不是溢出了吗?
我又做了这些测试:
结果正常输出了第13个字符。
而我加上指针时,又出现了其他结果:
第10个字符后成为乱码。
如果我在其中进行一个整形的变量赋值,结果能正常输出14个字符:
printf是输出到空字符停止,和字符数组结合后产生了这些奇怪的地方。或许有人有碰到过这个个问题,或许有人明白怎么回事,也或许在大神眼里这不算什么,总之,请大家分享一下自己的见解吧!
源代码如下:
#include <stdio.h> int main() { char ch; int space_count = 0; int letter_count = 0; int num_count = 0; int all_count = 0; int allall_count = 0; while (1) //多次输入 { ch = getchar(); //从缓冲区读取字符串 if (ch == ' ') { space_count++; //统计空格字符个数 } if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { letter_count++; //统计字母字符个数 } if (ch >= '0' && ch <= '9') { num_count++; //统计数字字符个数 } all_count++; //统计一次输入所有字符个数 allall_count++; //统计多次输入一共输入的字符个数 if (ch == '\n') { printf ("space_count : %d\n",space_count); printf ("letter_count : %d\n",letter_count); printf ("num_count : %d\n",num_count); printf ("all_count : %d\n",all_count); printf ("allall_count : %d\n",allall_count); //每次清空计数变量 space_count = 0; letter_count = 0; num_count = 0; all_count = 0; } } return 0; }
本题并不是很难,但在这里,我想要讨论一下关于字符的输入。要实现输入一串字符,我们常用的方法有使用scanf()读取一个字符串、使用gets()或fgets()读取一个字符串等。而这些方法都或多或少有一些缺点。使用scanf()读取一个字符串,会出现无法读取空格字符的问题,scanf()默认遇到空格就到了下一次读取。使用gets()则有风险,gets()从标准输入设备读字符串函数时会无限读取,不会判断上限,以回车结束读取,所以可能发生溢出。此外,前面介绍的方法都需要先定义一个字符数组,这就要求限定长度,而我们的输入可能很长,程序就存在漏洞,可能发生非法访问内存的问题。
根据本题的题意,适合的方法是循环从标准输入读取一个字符,并将它打印到屏幕上。使用ch = getchar();可以做到这一点,另外,scanf("%c",&ch);的功能也是一样。我们在完成问题时,需要灵活使用各种方法,千万不能被固有思想束缚。
不过今天在玩输入输出时,碰到一个问题。代码如下:
char s[10]; scanf("%s",s); printf ("%s\n",s);
当我输入的字符数量超过10个时,printf依旧能将字符全部输出,多余的字符不是溢出了吗?
我又做了这些测试:
char s[10]; scanf("%s",s); printf ("%s\n",s);
printf ("%s\n",s+12);
结果正常输出了第13个字符。
而我加上指针时,又出现了其他结果:
char s[10]; char *p; scanf("%s",s); printf ("%s\n",s); p = s; printf ("%s\n",s);
第10个字符后成为乱码。
如果我在其中进行一个整形的变量赋值,结果能正常输出14个字符:
char s[10]; scanf("%s",s); printf ("%s\n",s);
int a = 0;
printf ("%s\n",s);
printf是输出到空字符停止,和字符数组结合后产生了这些奇怪的地方。或许有人有碰到过这个个问题,或许有人明白怎么回事,也或许在大神眼里这不算什么,总之,请大家分享一下自己的见解吧!
相关文章推荐
- sicily 1003. 统计各种字符的数量
- [VC/MFC]一条语句实现程序运行时隐藏窗口
- 简单LinuxC程序关于实现识别字符串中合法的帧(字符串输入)
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
- [VC/MFC]一条语句实现程序运行时隐藏窗口
- 从终端获取一个字符串,分别统计其中大写字母、小写字母、数字及其它字符的个数。
- 简单LinuxC程序关于任意长整数相加(字符串实现)
- 从终端获取一个字符串,分别统计当中大写字母、小写字母、数字及其他字符的个数。
- 一条SQL语句,关于字符分割关联多条记录的问题
- 一条sql语句实现统计查询
- 关于获取每一条查询语句的记录数的方法总结
- 简单LinuxC程序关于加密(将任意长字符转换为定长整数)
- 关于ADO.NET,只须一个连接,一条SQL语句,轻松实现增删改查
- 关于一个选举的票数统计程序,每一位候选人的记录内容均为字符0或1,1表示此人被选中,0表示此人未被选中,若一张选票选中人数大于5个人时被认为无效的选票。
- 一条语句实现程序运行时隐藏窗口
- 关于用一条sql语句实现交换两条记录的的数据
- 通过程序统计字符串的大写字母个数、小写字母个数、数字个数和其它字符个数。用函数func实现功能
- 简单LinuxC程序关于实现进制转换
- 实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4字符以上含4字符)的出现频率。
- [VC/MFC]一条语句实现程序运行时隐藏窗口