输入名称(空格)

Input name with (whitespace)

任何人都可以帮助我的代码

void gotoxy(int, int);
void clrscr();
void dispMenu();

int main(void){
    int choice;

    choice = 0;
menu:
    dispMenu();
    scanf("%d", &choice);

    if(choice==1){
        clrscr();

        char name[100];

        printf("Please Input your Complete name: ");
        scanf("%[^\n]s", &name);

        printf("Your name is: %s \n", name);
    }

    getch();
    goto menu;
}

void dispMenu(){
    gotoxy(23,9);
    printf("List of C-Lang Activities\n");
    gotoxy(23,11);
    printf("1. Input Name");
    gotoxy(23,12);
    printf("2. (blank) \n");
    gotoxy(23,13);
    printf("3. (blank) \n");
    gotoxy(23,14);
    printf("4. (blank)\n");
    gotoxy(23,15);
    printf("5. (blank)\n");
    gotoxy(23,17);
    printf("Please Enter the Number of your choice: ");
}

void gotoxy(int x, int y){
    HANDLE hConsoleOutput;
    COORD dxCursorPosition;
    dxCursorPosition.X = x;
    dxCursorPosition.Y = y;

    hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hConsoleOutput, dxCursorPosition);
}

void clrscr(){
    system("cls");
}

我在尝试将我的程序放入 table 菜单时遇到问题,这会出现以下内容:

输出会像这样

Please Input your Complete Name: John Kenneth

Your Name is: John Kenneth

使用标准函数fgets。例如

fgets( name, sizeof( name ), stdin );
name[strcspn( name, "\n" )] = '[=10=]';

考虑到使用 goto 语句不是一个好主意。您应该忘记 C 中有 goto 语句。请改用 whiledo-while 循环。

你的问题在于

scanf("%[^\n]s", &name);

它有 2 个问题:

  1. %[ 需要 char*,但您提供了 char(*)[100]
  2. s 不是 %[ 说明符的一部分。

解决这些问题,您得到

scanf("%[^\n]", name);

但您会注意到您再次获得相同的输出。这是因为如果要读取的第一个字符是 \n%[^\n] 将失败。想知道这个角色是从哪里来的?还记得在为前一个 scanf 输入数字后按 Enter 吗?此字符在 stdin 中占主导地位,使 scanf("%[^\n]", name); 失败。

你也可以通过在格式字符串前添加一个白色space字符来指示scanf到discard/skip所有白色space字符来解决这个问题,比如说,一个space,像这样:

scanf(" %[^\n]", name);

现在它将按预期工作。

请注意,最好使用长度说明符来限制 scanf 读取的字符数,这样您就可以避免一些缓冲区溢出。这可以通过使用来完成:

scanf(" %99[^\n]", name);

我使用了 99,因为必须为字符串末尾的 NUL 终止符 ('[=27=]') 保留额外的 space。

还有,最好检查一下scanf的return值,看是否成功:

if(scanf(" %99[^\n]", name) != 1)
    /* Input error or EOF */