2017-01-12 8 views
-1

Я пишу код для изменения строки ввода в верхний/нижний регистр в зависимости от выбора пользователя. Это мой код:C - scanf не работает с оператором switch

#include<stdio.h> 
#include<stdlib.h> 
#include<ctype.h> 
#include<string.h> 

main(){ 
    char line[20]; 
    char sign; 
    int i =0; 
    printf("Write your line:\n"); 
    scanf("%99[^\n]", &line); 
    printf("Choose U or L:\n"); 
    scanf("%c", &sign); 
    switch(sign){ 
    case 'U': 
     for(i = 0; i <strlen(line); i++){ 
     printf("%c",toupper(line[i]));} 
     break; 
    case 'L': 
     for(i = 0; i <strlen(line); i++){ 
     printf("%c",tolower(line[i]));} 
     break; 
    default: 
     break; 
    } 
    return 0; 
} 

Оператор switch работает нормально, если я укажу, какой знак находится в коде. Но когда я пытаюсь запустить его, он позволяет мне вводить строку, печатает следующий вопрос и, не позволяя мне вводить выбранное письмо, завершается. Что я делаю не так? Я экспериментировал с инструкцией scanf и, похоже, проблема, как если бы программа не могла выполнять два заявления scanf один за другим. Любая помощь?

+3

'зсапЕ ("% 99 [^ \ п]", &line);' '-> зсапЕ ("% 19 [^ \ п]% * C", линия); ' – BLUEPIXY

+0

Не используйте' scanf' для ввода пользователем. Используйте 'fgets'. – melpomene

+0

[Этот вопрос] (http://stackoverflow.com/questions/41499535/scanf-clarification-in-c-language) ближе к проблеме OP о получении строки ввода пользователем с помощью 'scanf()'. –

ответ

1

Вы пытаетесь сохранить входные данные из scanf в строку «array», которая имеет только 20 элементов. Но вы принимаете 99 символов от scanf. Вам нужно исправить одно из этих двух. Также не забудьте указать \0 в размере массива.

Кроме того, у вас есть другая проблема: вы используете несколько операторов scanf без очистки входного буфера. Таким образом, клавиша ENTER, введенная в первом scanf, остается в буфере и потребляется вторым. Вы можете использовать getchar для второго чтения:

printf("Write your line:\n"); 
scanf("%99[^\n]", &line); 
while((sign = getchar()) != 'U' && sign != 'L') { 
    printf("Choose U or L:\n"); 

} 
//scanf(" %c", &sign); 
switch(sign){ 
+0

спасибо, я didn ' t уведомления (знаете?), что scanf принимает 99 символов таким образом! – Swaglina

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