您的位置:首页 > 运维架构 > Linux

简单LinuxC程序关于实现从终端获取一条语句并统计各种字符数量(字符输入输出)

2017-07-12 19:38 302 查看
实现从终端获取一条语句,计算这条语句中的空格、字母、数字的个数,统计这条语句全部字符的数量,实现多次输入,并统计一共输入的字符的数量。

源代码如下:

#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是输出到空字符停止,和字符数组结合后产生了这些奇怪的地方。或许有人有碰到过这个个问题,或许有人明白怎么回事,也或许在大神眼里这不算什么,总之,请大家分享一下自己的见解吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐