程序运行时的问题
#include <stdio.h>#include <string.h>
static int letters = 0,nums = 0,spaces = 0,others = 0;
void tongji(char *p);
int main()
{
int i = 0;
char *p,array;
p = array;
while(getchar() != '\n')
{
*(p + i) = getchar();
i++;
}
tongji(p);
printf("字母个数 = %d\n",letters);
printf("数字个数 = %d\n",nums);
printf("空格个数 = %d\n",spaces);
printf("其他字符个数 = %d\n",others);
printf("\n");
}
void tongji(char *p)
{
int i,len;
char ch;
char array;
len = strlen(array);
for(i = 0;i < len;i++)
{
ch = *(p + i);
if(ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122)
{
letters += 1;
}
else if(ch >= 48 && ch <= 57)
{
nums += 1;
}
else if(ch == ' ')
{
spaces += 1;
}
else
{
others += 1;
}
}
}
程序步进运行时正常,正常运行时,需要按两次回车键,怎么修改?
本帖最后由 巴巴鲁 于 2020-9-21 19:36 编辑
while里的getchar();删掉换成12行的代码
再把12行代码删掉试试看,我现在不方便上机操作
----------------------------------------------------------------------
其实不是输入两次回车才结束,如果你输入1 3(后面输入任意字符),再接着输入回车,程序也会结束
为什么呢?因为你输入的字符被while里getchar()给缓冲掉了,相当于输入的字符没有了意义
这也就是为什么使用getchar函数赋值时要"ch = getchar();"
如果只写"getchar();"程序会吃掉你输入的那个字符,这也是getchar();在某种情况下会用的一种用法 #include <stdio.h>
#include <string.h>
static int letters = 0, nums = 0, spaces = 0, others = 0;
void tongji(char* p);
int main()
{
int i = 0;
char* p, array;
p = array;
while ((*(p + i) = getchar()) != '\n')
{
i++;
}
*(p + i) = '\0';
tongji(p);
printf("字母个数 = %d\n", letters);
printf("数字个数 = %d\n", nums);
printf("空格个数 = %d\n", spaces);
printf("其他字符个数 = %d\n", others);
printf("\n");
}
void tongji(char* p)
{
int i, len;
char ch;
len = strlen(p);
for (i = 0; i < len; i++)
{
ch = *(p + i);
if (ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122)
{
letters += 1;
}
else if (ch >= 48 && ch <= 57)
{
nums += 1;
}
else if (ch == ' ')
{
spaces += 1;
}
else
{
others += 1;
}
}
} 程序步进运行时正常,正常运行时,需要按两次回车键
估计你是没有理解其中的原理:
(1)键盘缓冲区 和 输入流数据缓冲区
当我们在键盘上敲键时,敲入的一个个键值都暂存在键盘缓冲区里,只有遇到回车键(回车键也是字符,\n )时,敲入的键值才从键盘缓冲区送入到输入流数据缓冲区。
(2)getchar() 是到输入流数据缓冲区去读取一个字符,当输入流数据缓冲区没有数据时,读语句就等待,当输入流数据缓冲区有数据时,就读最先进来的那个字符。读一个,就从输入流数据缓冲区里清除掉这个字符。getchar() != '\n' 是进一步判断刚读入的这个字符是不是回车键。
(3)while (getchar() != '\n' ) continue;与 while (getchar() != '\n' ) 空语句 ; 作用相同,就是 循环着到输入流数据缓冲区去读取一个一个字符,只要读到的不是 '\n', 就继续读 (读一个清除一个),直到读到 '\n'。其作用等价于 “清除输入流数据缓冲区”。
(4)输入流数据缓冲区被清除后,程序再次等待键盘缓冲区把东西送过来。而键盘缓冲区等待用户敲入字符,此时若键盘缓冲区送过来的 '\n' ,则结束这个 while 循环。
而 *(p + i) = getchar() 将 getchar() 读取键盘输入的值赋给 (p + i) 这个数组单元,然后再判断 (p + i) 这个单元的值 *(p + i) 是否是 '\n',如果不是回车键,则循环继续,如果是回车键,则结束循环。
以上就是为什么你调试程序时正常,正式运行时,在输入完字符后敲回车键确认(注意,此时敲的回车键只是确认输入)后,还需敲一次回车键的原因。
程序的修改,楼上的两位已经说的很清楚了,我就不重复了。 getchar一个简单的用法:
#include <stdio.h>
int main(void)
{
int num;
char ch;
printf("请输入一个数字:");
scanf("%d",&num);
// getchar()简单用法,可以看看有没有这句程序的输出不同
getchar(); // 这里就是缓冲回车符
printf("请输入任意字符:(只有在输入回车才会打印)\n");
if((ch = getchar()) == '\n')
{
printf("没想到吧!我直接输出了\n");
}
return 0;
} 巴巴鲁 发表于 2020-9-21 14:05
while里的getchar();删掉换成12行的代码
再把12行代码删掉试试看,我现在不方便上机操作
--------------- ...
谢谢你讲解! baige 发表于 2020-9-21 14:05
谢谢! 谢谢! 有鱼还不行啊,我不可能每次都要求助,我还是想要渔 风过无痕1989 发表于 2020-9-21 19:46
估计你是没有理解其中的原理:
(1)键盘缓冲区 和 输入流数据缓冲区
谢谢! 你的讲解,我彻底明白了getchar()的用法
页:
[1]