输入名称(空格)

时间:2016-02-02 11:58:16

标签: c removing-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");
}

当我试图将我的程序放到表格菜单中时,我遇到了问题:

enter image description here

输出将是这样的

Please Input your Complete Name: John Kenneth

Your Name is: John Kenneth

2 个答案:

答案 0 :(得分:2)

使用标准函数fgets。例如

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

考虑到使用goto语句是个坏主意。你应该忘记C中有goto语句。而是使用whiledo-while循环。

答案 1 :(得分:0)

你的问题在于

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

它有两个问题:

  1. %[需要char*,但您提供char(*)[100]
  2. s不属于%[说明符。
  3. 解决这些问题,你得到

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

    但是您会注意到您再次获得相同的输出。这是因为如果要读取的第一个字符是%[^\n]\n将失败。想知道这个角色来自哪里?记得在输入上一个scanf的号码后按 Enter stdin使scanf("%[^\n]", name);失败,这个字符占优势。

    您也可以通过在格式字符串之前添加空白字符(例如空格)来指示scanf在阅读之前丢弃/跳过所有空白字符来解决此问题:

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

    现在它按预期工作。

    请注意,最好使用长度说明符限制scanf要读取的字符数,以便释放一些缓冲区溢出。这可以通过使用:

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

    我使用了99,因为必须为字符串末尾的NUL终结符('\0')保留额外的空格。

    此外,最好检查scanf的返回值,看看它是否成功:

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