2016-11-09 9 views
2

少なくとも11文字と4桁の行を返すようなプログラムを書いています。私は変数の種類と何かを混乱させたと思いますが、私はそれをどのように修正すべきかを理解できません。与えられた文字数の行を表示する

temp[i]=line; 

lineは同様に読み取るためにループ内で使用されます。

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


int main() 
{ 
    char line[200]; 
    char *temp[200]; 
    int i = 0, k=0; 

    printf("Enter a string: \n"); 
    while(fgets(line, sizeof(line),stdin)) 
    { 
     int numberAlpha = 0; 
     int numberDigit = 0; 
     int i; 
     for(i=0; i<strlen(line); i++){ 
      if(isalpha(line[i])) numberAlpha++; 
      else if(isdigit(line[i])) numberDigit++; 
     } 

     if(numberAlpha+numberDigit>10 && numberDigit>3){ 
      temp[i]=line; 
      i++; 
     } 
    } 
    while(temp[k]!='\0'){ 
     printf("%s", temp[k]); 
     k++; 
    } 
    return 0; 
} 
+1

バイ解決することができます。悲しいことに、それが指す文字列は次の行で上書きされます。 'strdup'を見てください。 –

答えて

1

問題は、あなたがここに同じアドレスを割り当てるです。つまり、すべての繰り返しで上書きされます。

代わりに、あなたはstrdup()(POSIX機能)を使用することができます。

temp[i] = strdup(line); 

興味のある行をコピーするために、あなたが同じことを行うためにmalloc() + strcpy()を使用することができますstrdup()利用できない場合。プラス、後でfree()。あなたが望むものではないかもしれないバッファに空きがあるかどう

  • fgets()は改行文字で読みます:

    加えて、あることに注意してください。だから、あなたはそれをトリミングする必要があります。

    if(isalpha(line[i])) numberAlpha++; 
    else if(isdigit(line[i])) numberDigit++; 
    

    if(isalpha((unsigned char)line[i])) numberAlpha++; 
    else if((unsigned char)isdigit(line[i])) numberDigit++; 
    
  • 次のようになります。この2行は、IE isalpha()isdigit()への引数は、潜在的な未定義の動作を避けるために unsigned charにキャストする必要があります

    line[strcspn(line, "\n")] = 0; /* trim the trailing newline, if any */ 
    
  • :あなたがそれを行うことができます

+0

これは、ありがとう、ありがとう。それらの「空想」機能を必要としないプログラムを書くための他の方法はありますか? – NouName

+0

これらの行を「覚えておく」必要がない限り、ループ内ですぐに印刷することでコピーを避けることができます。つまり、 'temp [i] = line;'を 'printf("%s \ n "、line);で置き換えることができます。 –

+0

あなたの提案に応じて変更を加えましたが、if文の後に最初の行を戻した後にクラッシュするようです。 – NouName

1

あなたは同じものを再利用していますバッファーは毎回バッファーし、そのバッファーへのポインターを配列tempに保管しています。あなたが最終的に何をしようとしているのは、その配列内の同じポインタの束であり、そのポインタはファイルの最後の行を指しています。あなたの代わりに何ができるか

は、以下にごtemp[i]=line文を書き換えることである:

temp[i] = malloc(sizeof(line)) 
memcpy(temp[i], line, sizeof(line)) 

そうすることで、あなたはどれがないので、マッチラインの内容で新しい配列を作成することがありますあなたが来て、ファイルの次の行を読むときに上書きされます。

あなたはヒープ上にそれを割り当てているので、あなたの関数の最後に、あなたがそれを解放したいと思う、ということ注:

while (temp[k] != '\0') { 
    printf(...); 
    free(temp[k]); 
    k++ 
} 
1

としては、1つの問題は
のコピーである、前に言いましたtemp [i] =行;
これは、新しいヒープ割り当てを行い、tempにmemcopyを実行することで解決できます。 私が見ることができるもう一つの問題は - 変数iの値です。その後、temp配列は常にstrlen(行)インデックスに割り当てられます。あなたは0からtemp配列に格納することを考えているかもしれません。これは起こっていません。
これは、あなたが成功した文字列、ポインタのみをコピーしていない

int start_index=0; 
while(...){ 
if(numberAlpha+numberDigit>10 && numberDigit>3){ 
     temp[start_index]=line; 
     start_index++; 
    } 
} 
関連する問題