乐乐学编程 发表于 2020-9-21 14:00:00

程序运行时的问题

#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 14:05:02

本帖最后由 巴巴鲁 于 2020-9-21 19:36 编辑

while里的getchar();删掉换成12行的代码
再把12行代码删掉试试看,我现在不方便上机操作
----------------------------------------------------------------------
其实不是输入两次回车才结束,如果你输入1 3(后面输入任意字符),再接着输入回车,程序也会结束
为什么呢?因为你输入的字符被while里getchar()给缓冲掉了,相当于输入的字符没有了意义
这也就是为什么使用getchar函数赋值时要"ch = getchar();"
如果只写"getchar();"程序会吃掉你输入的那个字符,这也是getchar();在某种情况下会用的一种用法

baige 发表于 2020-9-21 14:05:37

#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;
      }
    }

}

风过无痕1989 发表于 2020-9-21 19:46:18

程序步进运行时正常,正常运行时,需要按两次回车键

估计你是没有理解其中的原理:

    (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',如果不是回车键,则循环继续,如果是回车键,则结束循环。

      以上就是为什么你调试程序时正常,正式运行时,在输入完字符后敲回车键确认(注意,此时敲的回车键只是确认输入)后,还需敲一次回车键的原因。

      程序的修改,楼上的两位已经说的很清楚了,我就不重复了。

巴巴鲁 发表于 2020-9-21 19:49:50

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 23:21:53

巴巴鲁 发表于 2020-9-21 14:05
while里的getchar();删掉换成12行的代码
再把12行代码删掉试试看,我现在不方便上机操作
--------------- ...

谢谢你讲解!

乐乐学编程 发表于 2020-9-21 23:24:21

baige 发表于 2020-9-21 14:05


谢谢! 谢谢! 有鱼还不行啊,我不可能每次都要求助,我还是想要渔

乐乐学编程 发表于 2020-9-21 23:25:40

风过无痕1989 发表于 2020-9-21 19:46
估计你是没有理解其中的原理:

    (1)键盘缓冲区 和 输入流数据缓冲区


谢谢! 你的讲解,我彻底明白了getchar()的用法
页: [1]
查看完整版本: 程序运行时的问题