2013-10-26 12 views
-1

Я пытаюсь выяснить, вводит ли пользователь «h», чтобы я мог запускать другую функцию, но по какой-то причине, когда я запускаю программу, она указывает на ошибку сегментации. Любая помощь будет оценена по достоинству.Сравнение ввода пользователя со строкой в ​​C

char checkh[] = "h"; 
char *checkInput; 
printf("Enter input:"); 
scanf("%s", checkInput); 

    if(strcmp(checkInput, checkh) == 0){ 
      helpMsg(); 
    } 
+1

Память выделена для 'checkInput'. Вам нужен массив. Но не используйте 'scanf()' для получения пользовательского ввода, это зло. Просто объявите буфер (массив 'char's), затем вызовите' fgets (buf, sizeof buf, stdin) '. Но это повторяется много раз. Я имею в виду сотни раз. Почему вы не могли потратить минуту или две на поиск решения такой тривиальной ошибки? –

+1

@ H2CO3 все, что вы сказали, у меня большие пальцы, кроме комментария 'scanf'. Вы можете защитить от переполнения с префиксом длины: '% Ns'. Важно только, если вы не хотите есть целую линию из потока, так как 'fgets()' будет с достаточным буфером. Если это не важно, 'fgets()' является выбором defacto. = P – WhozCraig

+0

@WhozCraig Правда, и я это знаю, но ИМХО это еще более зло. 'scanf ("% Ns ")' does ** not ** NUL-terminate, если вход слишком длинный, поэтому он кажется безопасным, но на самом деле он небезопасен. ** Довольно, пожалуйста, не предлагайте его использование. ** И вообще, 'scanf()' имеет неинтуитивные причуды, которые делают программирование излишне сложным. Нет необходимости в этом. –

ответ

2

Вы можете сделать это с помощью простой по:

char choice; 
scanf("%c",&choice); 
if(choice=='h' || choice=='H') 
{ 
    help(); 
} 
+2

Еще лучше, 'choice = getchar();'. –

+0

+1 (и +1 к @ H2CO3, см., Мы * делаем * соглашаемся на множество вещей = P). Обратите внимание: будьте осторожны, если это делается в цикле, так как спецификатор формата '% c' будет * не * потреблять и игнорировать пробелы, такие как извлечение строки. – WhozCraig

0

Это то, что комментарии все говорят о том, я считаю. Вы должны выделить память, прежде чем использовать char *var так, как вы.

В вашем существующем коде добавьте указанные строки, и вы не получите ошибку seg.

char checkh[] = "h"; 
char *checkInput; 
checkInput = malloc(10);//add this line; 
printf("Enter input:"); 
scanf("%s", checkInput); 

    if(strcmp(checkInput, checkh) == 0){ 
      helpMsg(); 
    } 
//some code 
free(checkInput);//add this line 
+0

Это рецепт ** неопределенного поведения **, если пользователь вводит более девяти символов. Либо используйте 'fgets()' (бросая H2CO3 его богатые заслуги), либо правильно ограничивают максимальную длину строки в строке формата. – WhozCraig

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