Codifica RLE...Cosa c'è di sbagliato?
Domanda
Io sto cercando di fare un RLE (Run-Length Encoder) è un Programma solo per i personaggi.Ho letto il modo in cui funziona sul note sull'esterno della rete.E ho provato a risolvere il mio codice!A prescindere penso che i passaggi di codice, a destra, il codice non funziona!Sembra che alcuni strani 'Z' come funziona.Non riesco davvero a trovare cosa;s sbagliato!La prego mi dia un consiglio?
#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;
}
ad es.Mi ha dato l'input:
AAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEGGGGGGGGGGGGGGGGVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRHD RRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMS TTTTTTTTTTHHHHHHHHHHHH
e ho avuto l'output:
Z0AZZ0AZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0GZZ0GZZ0GZZ0GZZ0GZZ0GZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0RZZ0RZZ0RZZ0RZZ0 ZZ0RZZ0RZZ0RZZ0RZZ0RZZ0RZZ0HZZ0HZZ0HZZ0HZZ0HZZ0HZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :(
Soluzione
La conversione di precedenti commenti in risposta...
Ci sono problemi con le assegnazioni in la 'se' condizioni - come ha sottolineato in un'altra risposta.
Non è possibile assegnare un valore a una variabile di tipo unsigned char e poi aspettare di rilevare EOF.Dimenticate il nome - si ricorda che getc() e getchar() (e fgetc()) return il numero, non un char;loro devono restituire un intero perché hanno bisogno di tornare ogni possibile carattere valido il valore più EOF!
Il test al
if(currChar=='EOF')
è bizzarro.Si utilizza un multi-carattere costante, che è definito dall'implementazione, e che non sta andando a parità di EOF (non quotate) come restituito da getchar().E il tipo di currChar è sbagliato.reverse() restituisce sempre 0;è che quello che si voleva davvero?
La linea '
while(currChar=getchar() != EOF)
esigenze parentesi extra in modo che funziona come previsto:'while((currChar = getchar()) != EOF)
'.Al momento, si assegna 0 (NUL, '\0') o 1 (Controllo) per currChar.All'interno del ciclo while non legge i caratteri, in modo che si sta per inviare il tuo programma in un frenzy - ha bisogno di assegnazione '
while((currChar = getchar()) != EOF)
'la notazione troppo.Allora avete bisogno di capire che cosa l'output atteso è davvero, perché io non penso che abbia molto senso, in particolare, il randagio 'printf("%c",currChar);
'dopo la prova principale è dubbia, forse non è un debug stampa che si è lasciato alle spalle da un incidente.È inoltre necessario considerare come il codice deve gestire le cose come a capo, e che prima di arrivare a problemi di ambiguità in uscita (come si fa a dire la differenza tra il RLE codificato e i dati contenente valori numerici.C'è molto di cui preoccuparsi nel vostro algoritmo!Non è per lo più corretto, mi dispiace per il report.
Ecco alcune semi-codice di lavoro;esplicitamente rifiuta di trattare con le cifre (ma tutti).
/* 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;
}
E questo è il risultato quando si esegue su codice sorgente (nota che uso di spazi, non schede).Il 'Falso carattere' messaggi vengono stampati su stderr, non 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 ;
}
Altri suggerimenti
Guardate questa linea:
if ( ( (currChar='A')&&(currChar='Z') ) || ( (currChar='a')&&(currChar='z') ) )
si sta assegnando 'A' per currChar
allora si stanno assegnando 'Z' per currChar
e così via ...
È necessario modificare =
a ==
per rendere il confronto invece di assegnazione.
Inoltre, che cosa si intende per (currChar='A')&&(currChar='Z')
? currChar
non può essere 'A' e 'Z', allo stesso tempo, credo che ciò che si intende mettere qui era un assegno di currChar
essere inclusi in certo intervallo. Quindi probabilmente dovrebbe essere:
(currChar>='A')&&(currChar<='Z')
Lo stesso vale per la seconda parte della sua condizione.