RLE Кодировка ... Что не так? - PullRequest
0 голосов
/ 21 марта 2010

Я пытаюсь создать программу 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

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(

Ответы [ 2 ]

3 голосов
/ 21 марта 2010

Посмотрите на эту строку:

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

вы назначаете 'A' для currChar, затем вы назначаете 'Z' для currChar и так далее ...

Вам нужно изменить = на ==, чтобы сделать сравнение вместо присвоения.

Кроме того, что вы подразумеваете под (currChar='A')&&(currChar='Z')?currChar не может быть одновременно «A» и «Z», я полагаю, что вы хотели поставить здесь проверку на включение 1011 * в определенный интервал.Так что, вероятно, должно быть:

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

То же самое относится ко второй части вашего состояния.

2 голосов
/ 21 марта 2010

Преобразование предыдущих комментариев в ответ ...

  • Есть проблемы с назначениями в условиях «если» - как указано в другом ответе.

  • Вы не можете присвоить значение неподписанному символу и затем ожидать обнаружения EOF. Забудьте имя - помните, что getc () и getchar () (и fgetc ()) возвращают целое число, а не символ; они должны возвращать целое число, потому что они должны возвращать каждое возможное допустимое значение символа плюс EOF!

  • Ваш тест на if(currChar=='EOF') странный. Вы используете многосимвольную константу, которая в лучшем случае определяется реализацией, и которая не будет равна EOF (без кавычек), как возвращено getchar (). Плюс неправильный тип 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;
}

И это вывод, когда я запускаю его с собственным исходным кодом (обратите внимание, что я использую пробелы, а не символы табуляции). Сообщения «Поддельный символ» печатаются на stderr, а не на stdout.

/* 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 ;
}
...