2016-10-26 3 views
-1

getline関数から単語数を取得しようとしていますが、セグメント化エラーが発生しています。ここでは、空白は '\ t'、 '\ n'、 ''としてのみ定義されます。getlineから語数を取得する方法は?

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

int tokenCount(char *mystring){ 
    int word=0; 
    char *ptr = mystring; 
    int i; 

    for(i=0; i<strlen(mystring);i++){ 

      if(ptr[i]!=' ' || ptr[i]!= '\t' || ptr[i]!='\n'){ 
        word++; 

        while(ptr[i]!= ' ' || ptr[i]!= '\t' || ptr[i] != '\n'){ 

         i++; 
        } 
      } 

    } 


return word; 
} 

int main(){ 

    size_t n = 10; 
    char *mystring = malloc(10); 

    if(mystring==NULL){ 
      fprintf(stderr, "No memory\n"); 
      exit(1); 
    } 

    while(getline(&mystring, &n, stdin)>0){ 


      printf("%d\n", tokenCount(mystring)); 
    } 

return 0; 
} 

答えて

0
while(ptr[i]!= ' ' || ptr[i]!= '\t' || ptr[i] != '\n'){ 

ので、英語では、iでの値は、またはiの値がないタブ文字で、ないスペース文字である一方、またはiの値はではなく、改行です。問題を参照してください? ptr[i]'a'の場合は、スペース(良い)ではないためこのテストに合格します。それは' '(スペース文字)としてだ場合、それは' 'に等しいですが、それは'\t'に等しいではありませんので、ループは(悪い)続くので、しかし、それはまだ、渡します。これは無限ループであり、iをインクリメントするので、ポインタが未割り当てのメモリに参照してクラッシュする配列の最後を実行します。

||&&を使用してテストをしませ修正し、(また、何度も再計算していない、最初にstrlenをキャッシュ)、それを実行する前に、あなたは、文字列の末尾に達していないことを確認してください。

わずかな論理変化(キャッチ以上の空白文字)で
size_t mystringlen = strlen(mystring); 

... 

if (ptr[i]!= ' ' && ptr[i]!= '\t' && ptr[i] != '\n') { 
    ++word; 
    while(i < mystringlen && ptr[i]!= ' ' && ptr[i]!= '\t' && ptr[i] != '\n'){ 

... 

これはisspaceを簡素化することができます。

if (!isspace(ptr[i])) { 
    ++word; 
    while(i < mystringlen && !isspace(ptr[i])){ 
+0

は正しい方法が解除され、クラッシュを言っていません定義された動作

関連する問題