2013-12-08 4 views
0

FIXED: Привет, я получаю эту странную ошибку сегментации на C, когда я пытаюсь подсчитать слова в тексте. Может ли кто-нибудь объяснить мне, почему и решение для seg-fault?Seg Fault When Looping in Strings C Pointer

Вот мой исходный код:

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

int isword(char *str) { 
    return (isalnum(*(str + 1))) ? 1 : 0; 
} 

int main() { 
    char **text, c; 
    int n, i, j; 

    //reading from stdin & allocating it dynamically 
    scanf("%d\n", &n); 
    text = malloc(n * sizeof(char *)); 
    for(i = 0; i < n; i++) { 
     text[i] = malloc(200 * sizeof(char)); 
    } 

    for(i = 0; i < n; i++) { 
     for(j = 0; ; j++) { 
      scanf("%c", &c); 
      if(c == '\n') { 
       break; 
      } 
      text[i][j] = c; 
     } 
    } 

    // Counting words 
    int word_counter = 0; 
    char *delimitor = " "; 
    char *pos; 
    for(i = 0; i < n; i++) { 
     pos = text[i]; 
     do { 
      if(isspace(*pos) && isword(pos)) { 
       word_counter++; 
      } 
      pos ? pos++ : pos; 
      // pos++; 
     } while(*pos != '\0'); 
    } 

    printf("Number of words: %d\n", word_counter); 
    return 0; 
} 

Пример ввода:

4 
Adam baked a pie. 
Mary went   to a movie 
Mark goes like ?? him 
Gina is, hot 

Пожалуйста, обратите внимание на чрезмерное использование пространства во втором предложении.

У меня также есть другой вопрос о моем чтении от stdin. Есть ли лучший способ достичь этого? Я имею в виду, что я пытался сделать это с помощью fgets, но мне не удалось, и я знаю, что я не должен использовать gets (черт, даже GCC дает ему предупреждение, если вы используете get).

Другой вопрос: Почему он не печатает ожидаемое количество слов? И он печатает 12 вместо 14?

+0

Какая линия вызывает SEG-вины? (Подсказка: запустите свой код в отладчике ...) –

+0

сделать, пока вызывает seg-fault. Я отредактирую вопрос –

+2

Еще один намек: если 'pos' является указателем на символ, как вы проверяете, является ли символ, на который он указывает,' '\ 0''? – godel9

ответ

3
pos ? pos++ : pos; 
    // pos++; 
} while(pos != '\0'); 

в

*pos ? pos++ : pos; 
    // pos++; 
} while(*pos != '\0'); 
+0

Да, это правильно. Как @ godel9 намекнул в комментариях: D Чут-то, но все же он не считает правильно слов: s –

+0

Я думаю, что в логике программы есть ошибка в этом – BLUEPIXY

+1

@DragosRizescu Не считая слов в начале строки , – BLUEPIXY

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

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