2016-02-02 3 views
-2

Может кто-нибудь может помочь мне с моим кодомВведите имя с (пробел)

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 
+4

'зсапЕ ("% [^ \ п] s", &name);' не использовать '& 'здесь и'% ['сам по себе спецификатор, поэтому не ставьте' s' после него. – ameyCU

+0

что я должен использовать? – iCeStar

+0

См. Здесь -http: //www.cplusplus.com/reference/cstdio/scanf/ – ameyCU

ответ

0

Вы проблема с

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

Он имеет 2 вопроса:

  1. %[ ожидает char*, но вы предоставляете char(*)[100].
  2. s не является частью спецификатора %[.

Закрепление этих вопросов, вы получите

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

но вы заметите, что вы получите тот же результат снова. Это потому, что %[^\n] потерпит неудачу, если первый символ для чтения - \n. Интересно, откуда появился этот персонаж? Помните, нажимая Введите после ввода номера для предыдущего scanf? Этот символ преобладает в 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 */ 
2

Использование стандартной функции fgets. Например,

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

Примите во внимание, что использовать инструкцию goto является плохой идеей. Вы должны забыть, что есть инструкция goto в C. Используйте вместо этого цикл while или do-while.

 Смежные вопросы

  • Нет связанных вопросов^_^