2017-09-21 15 views
0

2日前にCの学習を始めましたが、課題の作業中に問題が発生しました。 char配列から文字のリストを取り出し、連続する文字を数え、それらを数字に置き換えることで文字のリストを短縮することを意図しています。 「aaaabbbbccccc」を「a4b5c5」とします。これが最初のif文を通じて倍の間違った量を行く、と私は理由を把握することはできませんいくつかの理由についてIf文での文字の比較

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

int main(int argc, char *argv[]) { 
    char letters[999]; 
    char newString[100]; 
    char counter[100]; 

    printf("Please input a string: "); 
    fgets(letters, sizeof(letters), stdin); 

    int i; 
    int count = 1; 
    int end = 0; 

    for (i=0; i < strlen(letters); i++) { 
     if (letters[i] != letters[i+1] || letters[i+1] == '\0') { 
      newString[end] = letters[i]; 
      end++; 
      printf("CHECK HERE"); 
      count = 1; 
     } else if (letters[i] == letters[i+1]) { 
      count++; 
     } 
    } 

    printf("%s", newString); 
    return 0; 
} 

:これは私がこれまで持っているコードです。それは性格平等声明と関係がありますか?出力は

CHECK HERECHECK HERECHECK HERE 
[letters in newString] 
+2

これは18行目のエラーですが、 '; ++ 'がありません'; ' –

+1

'' \ 0''という文字列を 'newString'に書いたか、' i + 1'操作で隠していますか? ?それを印刷する前に 'newString [end] = '\ 0';'がなければなりません。 –

+0

カウント値は出力されません。また、繰り返しがない場合、出力文字列( 'newString')は小さすぎます。 – BLUEPIXY

答えて

0

であることが判明しました。あなたが行ったように文字を比較することは問題ありません。しかし、あなたのコードはあなたの要求に応じて宛先文字列を生成しません。カウントは新しい文字列にロードされません。

if(letters[i] != letters[i+1] || letters[i+1] == '\0') { 
    newString [end] = letters [i]; 
    end++; 
    newString [end] = '0' + count; /* Converting integer count to ascii char */ 
    end++; 
} 

注:は新しい文字列をnullで終了することを忘れないでください。
PS .:カウントが1桁(バイト単位でロード)以上の場合は、特別にカウントする必要があります。

+0

ありがとうございました!カウントが1桁を超える場合はどうすればよいですか? –

+0

数値の各桁をどのように抽出し、上に示したようにその数値に変換するかを考えてみましょう。ヒント:除算とモジュロ演算子を考える。 – Prando