Pregunta

Estoy tratando de hacer una RLE (Run-Length Encoder) Programa para los personajes.He leído la forma en que funciona en notas sobre la red.Y traté de arreglar mi código!Independientemente creo que los pasos de código a la derecha, el código no funciona!Aparece un extraño 'Z' como se ejecuta.Yo realmente no puedo encontrar lo;s equivocado!Podría usted por favor darme un consejo?

#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;
}

por ejemplo,Me dio la entrada:

AAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEGGGGGGGGGGGGGGGGVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRHD RRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMS TTTTTTTTTTHHHHHHHHHHHH

y llegué a la salida:

Z0AZZ0AZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0GZZ0GZZ0GZZ0GZZ0GZZ0GZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0RZZ0RZZ0RZZ0RZZ0 ZZ0RZZ0RZZ0RZZ0RZZ0RZZ0RZZ0HZZ0HZZ0HZZ0HZZ0HZZ0HZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0

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

¿Fue útil?

Solución

La conversión de comentarios anteriores en una respuesta...

  • Hay problemas con las asignaciones en el 'si' condiciones - como se ha señalado en la otra respuesta.

  • Usted puede asignar un valor a un unsigned char y luego esperar para detectar EF.Olvidar el nombre de recordar que getc() y getchar() (y fgetc()) devuelven un entero, no un char;ellos tienen que devolver un entero porque tienen que devolver todo lo posible carácter válido el valor más EF!

  • El examen en if(currChar=='EOF') es extraño.Usted está usando un multi-carácter constante, que es en el mejor de implementación definido, y que no se va a la igualdad de EF (sin comillas) como el que devuelve getchar().Además el tipo de currChar está mal.

  • reverse() siempre devuelve 0;es que lo que realmente quería?

  • La línea 'while(currChar=getchar() != EOF) las necesidades de los paréntesis extra para que funcione como se esperaba:'while((currChar = getchar()) != EOF)'.Por el momento, se asigna 0 (NULL, '\0') o 1 (Control + a) a currChar.

  • El interior del bucle while no lee todos los caracteres, por lo que se va a enviar a su programa en un frenesí - se necesita la asignación de 'while((currChar = getchar()) != EOF)'la notación demasiado.Entonces usted necesita para trabajar de lo que la salida que se espera realmente es, porque creo que no tiene mucho sentido - en particular, la callejeros 'printf("%c",currChar);'después de la principal prueba es dudosa - tal vez es una depuración de impresión que dejaron atrás por accidente.

  • También es necesario considerar cómo el código debe manejar las cosas como saltos de línea - y eso es antes de que lleguemos a los problemas de ambigüedad en la salida (¿cómo puedes saber la diferencia entre el RLE de datos codificados y los datos que contiene valores numéricos.Hay mucho que preocuparse en su algoritmo!Es sobre todo no correcto, me siento informe.

Aquí hay algunos semi-código de trabajo;explícitamente se niega a tratar con los dígitos (pero eso es todo).

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

Y este es el resultado cuando se ejecuta en su propio código fuente (tenga en cuenta que el uso de los espacios, no fichas).El 'Falso carácter de' mensajes se imprimen en stderr, no 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 ;
}

Otros consejos

Mira esta línea:

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

está asignando 'A' a continuación currChar está asignando la 'z' a currChar y así sucesivamente ...

Es necesario cambiar = a == para que sea la comparación en lugar de asignación.

Además, ¿qué es lo que quiere decir con (currChar='A')&&(currChar='Z')? currChar no puede ser 'A' y 'Z', al mismo tiempo, creo que lo que quería era poner aquí un cheque por currChar ser incluido en cierto intervalo. Por lo que probablemente debería ser:

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

Lo mismo se aplica para la segunda parte de su condición.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top