Frage

Ich versuche, eine RLE (Run-Length-Encoder) Programm nur für Zeichen zu machen. Ich las, wie es auf Hinweise auf Netto funktioniert. Und ich versuchte, meinen Code zu beheben! Unabhängig davon glaube ich, dass die Schritte des Code recht, der Code funktioniert nicht! Es scheint eine seltsame ‚Z‘ wie es läuft. Ich kann wirklich nicht finden, was; s falsch! Könnten Sie mir bitte einen Rat geben?

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

z. Ich gab den Eingang:

  

AAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEGGGGGGGGGGGGGGGGVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRHD   RRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMS   TTTTTTTTTTHHHHHHHHHHHH

und ich bekam die Ausgabe:

  

Z0AZZ0AZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0GZZ0GZZ0GZZ0GZZ0GZZ0GZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0RZZ0RZZ0RZZ0RZZ0   ZZ0RZZ0RZZ0RZZ0RZZ0RZZ0RZZ0HZZ0HZZ0HZZ0HZZ0HZZ0HZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0

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

War es hilfreich?

Lösung

Konvertieren vorherige Kommentare in eine Antwort ...

  • Es gibt Probleme mit Aufgaben in dem 'wenn' Bedingungen -. Wie erwähnt in der anderen Antwort

  • Sie können keinen Wert auf einen unsigned char zuweisen und dann erwarten, dass EOF zu erkennen. Vergessen Sie den Namen - nicht vergessen, dass getc () und getchar () (und fgetc ()) gibt eine ganze Zahl, kein Zeichen; sie haben eine ganze Zahl zurück, weil sie alle möglichen gültigen Zeichenwert plus EOF!

  • zurückgeben müssen
  • Ihr Test bei if(currChar=='EOF') ist bizarr. Sie verwenden einen Multi-Zeichen-Konstante, die bestenfalls die Implementierung definiert ist, und die gleich EOF wird nicht wie von getchar zurück gehen (nicht kotierte) (). Plus die Art von currChar ist falsch.

  • reverse () liefert immer 0; ist das, was wollen Sie wirklich?

  • Die Zeile 'while(currChar=getchar() != EOF)' braucht zusätzliche Klammern, so dass es wie erwartet funktioniert: 'while((currChar = getchar()) != EOF)'. In dem Moment, weist er 0 (NUL, '\ 0') oder 1 (Control-A) zu currChar.

  • Die innere while-Schleife liest keine Zeichen, so dass er das Programm in einen Rausch schicken wird - es muss die Zuordnung von ‚while((currChar = getchar()) != EOF)‘ Notation zu. Dann müssen Sie herausfinden, was die erwartete Ausgabe wirklich ist, weil ich nicht denke, es viel Sinn macht - insbesondere die Streu ‚printf("%c",currChar);‘ nach der Hauptprüfung fragwürdig ist - vielleicht ist es ein Debug-Druck, dass Sie hinter sich gelassen durch Unfall.

  • Sie müssen auch überlegen, wie der Code Dinge wie Zeilenumbrüche behandeln sollte - und das ist, bevor wir zu Fragen der Mehrdeutigkeit in der Ausgabe zu erhalten (wie Sie den Unterschied zwischen den RLE codierten Daten und Daten mit numerischen Werten sagen Sie. Es gibt vielen Grund zur Sorge in Ihrem Algorithmus! Es ist vor allem nicht richtig, es tut mir leid zu berichten.

Hier einige halbArbeits Code; sie weigert sich explizit mit Ziffern zu behandeln (aber das ist alles).

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

Und das ist der Ausgang, wenn ich laufe es auf seine eigenen Quellcode (beachten Sie, dass ich Leerzeichen verwenden, nicht Tabs). Die 'Bogus Zeichen' Nachrichten werden auf stderr gedruckt, nicht 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 ;
}

Andere Tipps

Sehen Sie in dieser Zeile:

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

Sie zuweisen 'A' dann currChar Sie zuweisen 'Z' zu currChar und so weiter ...

Sie müssen sich ändern = zu == es Vergleich zu machen, anstatt Zuordnung.

Auch, was meinst du mit (currChar='A')&&(currChar='Z')? currChar kann nicht ‚A‘ und ‚Z‘ zur gleichen Zeit, ich glaube, was Sie meinten hier setzen ein Scheck über currChar war in bestimmtem Intervall enthalten ist. So sollte es wohl sein:

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

Das gleiche gilt für den zweiten Teil Ihrer Erkrankung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top