0

文字専用の RLE (Run-Length Encoder) プログラムを作成しようとしています。私はそれがネット上のメモでどのように機能するかを読みました。そして、コードを修正しようとしました!コードの手順は正しいと思いますが、コードは機能しません。実行すると、奇妙な「Z」が表示されます。私は本当に何が間違っているのかを見つけることができません! アドバイスをいただけませんか?

#include <stdio.h>

int main()
{
    int count;
    unsigned char currChar,prevChar=EOF;
    while(currChar=getchar() != EOF)
    {
        if ( ( (currChar='A')&&(currChar='Z') ) || ( (currChar='a')&&(currChar='z') ) )
        {
            printf("%c",currChar);
            if(prevChar==currChar)
            {
                count=0;
                currChar=getchar();
                while(currChar!=EOF)
                {
                    if (currChar==prevChar)
                        count++;
                    else
                    {   
                        if(count<=9)
                            printf("%d%c",count,prevChar);
                        else
                        {   
                            printf("%d%c",reverse(count),prevChar);
                        }                       
                        prevChar=currChar;
                        break;
                    }
                }
            }
            else
                prevChar=currChar;

            if(currChar==EOF)
            {   printf("%d",count);
                break;
            }
        }
        else
        {
            printf("Error Message:Only characters are accepted! Please try again! False input!");
            break;
        }
    }
    return 0;
}

int reverse(int x)
{
    int p,y,r=0;
    x=(x<0)?-x:x;
    while (x>0)
    {
        y=x%10;
        p=x/10;
        r=10*r+y;
        x=p;
    }
    printf("%d",r);
    return 1;
}

たとえば、次のように入力しました。

AAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEGGGGGGGGGGGGGGGGVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRHD RRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMS TTTTTTTTTTHHHHHHHHHHHH

そして、私は出力を得ました:

Z0AZZ0AZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0GZZ0GZZ0GZZ0GZZ0GZZ0GZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0RZZ0RZZ0RZZ0RZZ0 ZZ0RZZ0RZZ0RZZ0RZZ0RZZ0RZZ0HZZ0HZZ0HZZ0HZZ0HZZ0HZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :(

4

2 に答える 2

3

この行を見てください:

if ( ( (currChar='A')&&(currChar='Z') ) || ( (currChar='a')&&(currChar='z') ) )

「A」を割り当て、currChar次に「Z」を割り当てますcurrChar...

割り当てではなく比較するには、に変更=する必要があります。==

また、 とはどういう意味(currChar='A')&&(currChar='Z')ですか? currChar'A' と 'Z' を同時に指定することはできません。ここに入れようとしたのはcurrChar、特定の間隔に含まれているかどうかのチェックだったと思います。したがって、おそらく次のようになります。

(currChar>='A')&&(currChar<='Z')

同じことがあなたの状態の2番目の部分にも当てはまります。

于 2010-03-21T00:22:13.097 に答える
2

以前のコメントを回答に変換しています...

  • 他の回答で指摘されているように、「if」条件での割り当てには問題があります。

  • unsigned char に値を割り当てて、EOF の検出を期待することはできません。名前は忘れてください。getc() と getchar() (および fgetc()) は char ではなく整数を返すことに注意してください。すべての有効な文字値と EOF を返す必要があるため、整数を返す必要があります。

  • あなたのテストif(currChar=='EOF')は奇妙です。せいぜい実装定義であり、getchar() によって返される EOF (引用符なし) と等しくならない複数文字の定数を使用しています。さらに、currChar のタイプが間違っています。

  • reverse() は常に 0 を返します。それはあなたが本当に望んでいたことですか?

  • 行 ' while(currChar=getchar() != EOF)' は、期待どおりに動作するように追加の括弧が必要です: ' while((currChar = getchar()) != EOF)'。現時点では、0 (NUL、'\0') または 1 (Control-A) を currChar に割り当てます。

  • 内側の while ループは文字をまったく読み取らないため、プログラムを熱狂させることになります。代入 ' while((currChar = getchar()) != EOF)' 表記も必要です。次に、期待される出力が実際に何であるかを理解する必要があります。これはあまり意味がないと思うためです-特に、printf("%c",currChar);メインテストの後の迷走 ' ' は疑わしいです-おそらく、誤って残したデバッグ出力です.

  • また、コードが改行などをどのように処理する必要があるかを検討する必要があります。これは、出力のあいまいさの問題に取り組む前です (RLE でエンコードされたデータと数値を含むデータの違いをどのように見分けるのでしょうか。心配することはたくさんあります)。あなたのアルゴリズムについて! それはほとんど正しくありません、報告して申し訳ありません。

ここにいくつかの半作業コードがあります。数字の処理を明示的に拒否します (ただし、それだけです)。

/* RLE - Run Length Encoding */
/* SO 2485285 */

/*
** Input:  stream of data except for digits 0-9
** Output: stream of data with adjacent sets of 3 or more of the same
**         character represented by 3Z (for ZZZ), etc.
*/

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

static void print_rle(int count, int repchar)
{
    if (count > 2)
        printf("%d%c", count, repchar);
    else if (count == 2)
        printf("%c%c", repchar, repchar);
    else if (repchar != EOF)
        printf("%c", repchar);
}

int main()
{
    int count = 1;
    int currChar;
    int prevChar = EOF;

    while ((currChar = getchar()) != EOF)
    {
        if (isdigit(currChar))
            fprintf(stderr, "Bogus character %c read - ignored\n", currChar);
        else if (currChar == prevChar)
            count++;
        else
        {
            print_rle(count, prevChar);
            count = 1;
            prevChar = currChar;
        }
    }
    print_rle(count, prevChar);

    return 0;
}

これは、独自のソース コードで実行したときの出力です (タブではなくスペースを使用していることに注意してください)。「偽の文字」メッセージは、stdout ではなく、stderr に出力されます。

/* RLE - Run Length Encoding */
Bogus character 2 read - ignored
Bogus character 4 read - ignored
Bogus character 8 read - ignored
Bogus character 5 read - ignored
Bogus character 2 read - ignored
Bogus character 8 read - ignored
Bogus character 5 read - ignored
/* SO  */

/*
Bogus character 0 read - ignored
Bogus character 9 read - ignored
** Input:  stream of data except for digits -
Bogus character 3 read - ignored
** Output: stream of data with adjacent sets of  or more of the same
Bogus character 3 read - ignored
**9 character represented by Z (for 3Z), etc.
*/

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

static void print_rle(int count, int repchar)
{
Bogus character 2 read - ignored
4 if (count > )
8 printf("%d%c", count, repchar);
Bogus character 2 read - ignored
4 else if (count == )
8 printf("%c%c", repchar, repchar);
4 else if (repchar != EOF)
8 printf("%c", repchar);
}

int main()
{
Bogus character 1 read - ignored
4 int count = ;
4 int currChar;
4 int prevChar = EOF;

4 while ((currChar = getchar()) != EOF)
4 {
8 if (isdigit(currChar))
12 fprintf(stderr, "Bogus character %c read - ignored\n", currChar);
8 else if (currChar == prevChar)
12 count++;
8 else
8 {
12 print_rle(count, prevChar);
Bogus character 1 read - ignored
12 count = ;
12 prevChar = currChar;
8 }
4 }
4 print_rle(count, prevChar);

Bogus character 0 read - ignored
4 return ;
}
于 2010-03-21T02:45:56.223 に答える