为什么不按回车键'\ n'到getch()?

时间:2009-01-23 16:56:52

标签: c input

#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'在按Enter键时不会变为假?我还观察到ch正在使用\ r而不是\ n。请告诉我。感谢

10 个答案:

答案 0 :(得分:9)

使用'\ 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;
}

答案 1 :(得分:5)

尝试\ r而不是\ n

\ n是新行字符(0x0A)或10位小数,\ r是carrige返回字符(0x0D)或13位小数。

返回键是carrige返回。

答案 2 :(得分:4)

键盘返回键是回车符或CR。通过运行程序并分析结果可以找到它。

按Enter键时,不返回Enter键的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

答案 3 :(得分:1)

这是因为键盘上的返回键在内部表示为'\ r'而不是'\ n'。为了使该特定示例有效,您需要捕获'\ r'而不是。

答案 4 :(得分:0)

在某些系统上,换行符为“\ r \ n”回车符(输入)为“\ r”

答案 5 :(得分:0)

在Windows上输入实际上是“\ r \ n”(回车和换行)。 getchar()将返回'\ n'我认为。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

#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 语句

答案 8 :(得分:-1)

我认为最好只使用:

scanf("%19s", name);

而不是getch。

答案 9 :(得分:-1)

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

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

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

另一点是,某些平台需要刷新 stding 流,然后您必须将 fflush(3)调用应用于 stdin 流。

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