【问题标题】:Why doesn't pressing enter return '\n' to getch()?为什么不按 enter 返回 '\n' 到 getch()?
【发布时间】:2010-10-03 04:27:59
【问题描述】:
#include <stdio.h>
#include <conio.h>
main()
{
    char ch,name[20];
    int i=0;
    clrscr();
    printf("Enter a string:");
    while((ch=getch())!='\n')
    {
        name[i]=ch;
        i++;
    }
    name[i] = '\0';
    printf("%s",name);
}

当我输入“abc”时,如果我按下回车键,它就不起作用。谁能告诉我为什么当我按下回车时条件 ch=getch() != '\n' 没有变成假?我还观察到 ch 正在使用 \r 而不是 \n。请告诉我。谢谢

【问题讨论】:

    标签: c input


    【解决方案1】:

    使用 '\r' 并用 '\0' 结束你的字符串。

    此外,您可以尝试使用 getche() 为用户提供视觉回声并进行一些其他一般性更正:

    #include <stdio.h>
    #include <conio.h>
    
    #define MAX_NAME_LENGTH 20
    
    int main()
    {
        char ch, name[MAX_NAME_LENGTH];
        int i=0;
        clrscr();
        printf("Enter a string:");
        while ( ((ch=getche())!='\r') && (i < MAX_NAME_LENGTH - 1) )
        {
            name[i]=ch;
            i++;
        }
        name[i] = '\0';
        printf("%s\n",name);
    
        return 0;
    }
    

    【讨论】:

    • 可能是格式问题,但您的意思是以 null 结尾 - "\0",对...
    • 是的,对于 chars,'\0'、NULL 和 0 的意思是一样的,但是使用 '\0' 会更清楚、更同意和更正。
    • 只要您在纠正问题,您可能希望在 19 次迭代中限制 while 循环,使 main() 显式“int main(void)”,在提示 printf() 后刷新标准输出,并返回一个值。
    【解决方案2】:

    尝试 \r 而不是 \n

    \n 是换行符 (0x0A) 或十进制 10,\r 是回车符 (0x0D) 或十进制 13。

    回车键是回车键。

    【讨论】:

      【解决方案3】:

      键盘的回车键是回车,或 CR。这是通过运行程序并分析结果发现的。

      当你按下回车键时,回车键的ASCII值不返回,而是返回CR。

      因此(ch=getch())!='\n' 应更改为以下任何等效语句:

      ch=getch())!='\r' 
      ch=getch())!=13     // ASCII for CR: decimal
      ch=getch())!=0xd     // hexadecimal for CR
      ch=getch())!=0xD     // hexadecimal for CR
      ch=getch())!=015     // octal for CR
      

      【讨论】:

      • 欢迎来到stackoverflow。您可以使用工具栏中的{} 选项来格式化您的代码 sn-ps 以获得更好的可读性。
      【解决方案4】:

      在某些系统上,换行符是 "\r\n" 回车(回车)是 "\r"

      【讨论】:

        【解决方案5】:

        这是因为键盘上的返回键在内部表示为“\r”而不是“\n”。为了使该特定示例正常工作,您需要改为捕获 '\r'。

        【讨论】:

          【解决方案6】:

          在 Windows 上,回车实际上是“\r\n”(回车和换行)。 getchar() 会返回 '\n' 我想。

          【讨论】:

            【解决方案7】:

            \n的实际含义是\r+\ngetch() 函数从键盘读取一个字符。
            它不会回显它,也不会等待下一个字符。
            因此,每当我们输入\n 字符时,getch() 函数只会读取\r 字符。

            【讨论】:

              【解决方案8】:
              #include <stdio.h>
              #include <conio.h>
              int main()
              {
                  char ch,name[20];
                  int i=0;
                  printf("Enter a string:");
                  while(1)
                  {
                    ch = getch();
                    if(ch==13) //enter ASCII value
                    {
                      name[i]='\0';
                      break;
                    }
                    else
                    {
                      name[i]=ch;
                      i++;
                      printf("*");
                    }
                  }
                  printf("%s",name);
                  return 0;
              }
              

              你也可以通过简单的添加来添加退格功能

              else if(ch==8) //ASCII value of Backspace
               {
                 if(i>0)
                 {
                   i--;
                   printf("\b \b");
                 }
               }
              

              到 if else 语句

              【讨论】:

                【解决方案9】:

                我认为最好简单地使用:

                scanf("%19s", name);
                

                而不是 getch 的东西。

                【讨论】:

                • 如果不控制 i 的值,使用 while 时会出现同样的缓冲区溢出。有什么区别?
                • @Alnitak:我更新了代码以防止缓冲区溢出,您考虑过还是 scanf 有什么问题?
                • scanf("%19s", name); 不适用于包含空格的名称,
                【解决方案10】:

                这取决于您的系统。您还必须知道 getch() 它是 X-Open 或 OpenGroup 发布的 XSI 诅咒标准的一部分,与 Borland 特定的 conio.h 标头无关。

                您必须使用 getchar(3)getc(3),它们都属于 ISO/IEC 9899:1990 标准。这两个调用分别只从控制终端/控制台或输入流中检索一个字节。

                如果您从 Windows 平台调用它们,您可以使用 Enter 键、'\r'、'\n' 序列来检索,而不仅仅是 '\n'。然后您必须围绕 getchar(3)getc(3) 调用创建一个循环。此外,通过 stdin 调用 fgets(3) 可以获得 '\r', '\n' 序列。 p>

                另外一点,有些平台需要刷新stding流,那么你必须将fflush(3)调用应用到stdin流。

                fgets(3)fflush(3) 属于 ISO/IEC 9899:1990 标准。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-02-12
                  • 1970-01-01
                  • 2011-05-13
                  • 1970-01-01
                  • 2013-02-28
                  • 2018-04-14
                  • 1970-01-01
                  相关资源
                  最近更新 更多