2015-11-12 3 views
-1

Я пытаюсь прочитать в предложении пользователя и внести его в массив, где каждая буква содержит значение символа. Каждый раз, когда я запускаю программу, я могу ввести предложение, но после этого появляется «Ошибка сегментации (core dumped)». Все это происходит внутри функции, которая вызывается из основного.Ошибка сегментации (ядро сбрасывается) Массивы символов

int words(char sentence[]){ 
int i=0; 
    printf("Please enter your favorite sentence(max 100 characters).\n"); 
    scanf("%c", &sentence); 
      while(sentence != "." && sentence != "!"){ 
      i++; 
      scanf("%c", &sentence[i]); 
      } 
    printf("%d", i); 
    return i; 
} 
+1

Пропустили ли вы это через GDB? Также - что, если предложение не заканчивается точкой или восклицательным знаком? – tonysdg

+0

Запустите его через отладчик, например GDB, или используйте инструмент, например valgrind. Это может очень быстро сказать, что не так с кодом. – Evert

+1

Возможно, вы хотите, чтобы ваше первое назначение в 'scanf' было' & предложением [0] 'вместо? – Evert

ответ

1

Что говорит ваш компилятор при компиляции с -Wall -Wextra. Вы не можете ожидать корректного написания кода C без компиляции с предупреждениями. Все говорят, как сильно вы можете испортить код C, он позволяет вам что-то делать. Это правда, но предупреждения помогут вам.

Я не уверен, почему люди просят вас перейти к gdb или valgrind. Для меня этот код никогда не должен выполняться и ожидать, что он будет прав. Мой компилятор выкладывает эти предупреждения:

words.c: In function ‘words’: 
words.c:6: warning: format ‘%c’ expects type ‘char *’, but argument 2 has type ‘char **’ 
words.c:7: warning: comparison with string literal results in unspecified behavior 
words.c:7: warning: comparison with string literal results in unspecified behavior 

Фикс эти предупреждения, а затем вернуться, если вы все еще возникают проблемы. Или, если вы не понимаете, что означают эти предупреждения, задайте конкретный вопрос.

+1

Всякий раз, когда я вижу «segfault», я сразу же посылаю людей в GDB. TBH, это отчасти только я ленив ... Я начну по умолчанию «компилировать с помощью' -Wall -Wextra', исправлять эти ошибки, а затем запускать GDB ». Хорошая точка в целом. – tonysdg

+0

@tonysdg: конечно * вы * по умолчанию переходите к 'gdb', потому что ваши segfaults вызваны тем, что предупреждения не поймали, потому что вы уже знаете, скомпилировать их с ними! – dave

+0

Ха-ха, это моя мысль. Я должен начать дефолтировать свой ответ на SO, чтобы быть таким :) (И нет - я забыл скомпилировать эти флаги больше, чем я хотел бы признать) – tonysdg

0

Изменить код этого и он будет работать:

char sentence[30]; 
int i=0; 
printf("Enter phrase: \n"); 
scanf("%c", sentence); 
while(sentence[i]!='.' && sentence[i]!='!') 
{ 
     i++; 
     scanf("%c",&sentence[i]); 
} 
printf("%d\n", i); 
return i; 

Вы просто должны были удалить «&» из зсапЕ в четвертой строке, так как в одиночку, без указания индекса массива предложение является сам по себе адрес памяти , Обратите внимание, что это работает, если предложения всегда заканчиваются символом '.' или '!'. Хотя я считаю, что есть лучший способ сделать это, чем читать предложение за один символ за раз.

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