2016-09-16 4 views
0

Ich stecke in einem Problem in einem Buch fest. Das Problem ist -Warum gibt das Programm eine unerwartete Ausgabe?

Der prototypische Internet newbie Stipendiatin Name B1FF ist, der von wriring messages.Here ist ein typisches B1FF Communique .:

H3Y DUD3, C 15 R1LLY C00L

schreibt eine einzigartige Art und Weise hat ein „B1FF Filter“, die eine Nachricht durch den Benutzer und übersetzt sie in B1FF-sprechen eingegeben lautet:

eingeben Nachricht: Hey Kumpel, C ist rilly kühl
In B1FF-sprechen: H3Y DUD3, C 15 R1LLY C00L

Ihr Programm sollte die Messa konvertieren Bei Großbuchstaben ersetzen Sie Ziffern für bestimmte Buchstaben (A = 4, B = 8, E = 3, I = 1, O = 0, S = 5).

Mein Program-

#include<stdio.h> 
    int main() 
    { 
     char arr[50]={0},ch[50]={0}; 
     int i=0; 
     printf("\nenter the sentence : "); 

     while(arr[i-1]!='\n') 
     { 
     scanf("%c",&arr[i]); 
     i++; 
     } 

     i=0; 

     while(arr[i]!='\n') 
     { 
     if(arr[i]=='e') 
     ch[i]='3'; 
     if(arr[i]==('A'||'a')) 
     ch[i]='4'; 
     if(arr[i]==('B'||'b')) 
     ch[i]='8'; 
     if(arr[i]==('I'||'i')) 
     ch[i]='1'; 
     if(arr[i]==('o'||'O')) 
     ch[i]='0'; 
     if(arr[i]==('S'||'s')) 
     ch[i]='5'; 

     else ch[i]=arr[i]-32; 
     i++; 

    } 

    ch[i]='\n'; 
    i=0; 
    printf("\nIn B1FF-SPEAK : "); 

    while(ch[i]!='\n') 
    { 
    printf("%c",ch[i]); 
    i++; 
    } 

    printf("\n"); 
    return 0; 
} 


OUTPUT DER PROGRAM- IMAGE



Ich verstehe nicht, warum das Programm nicht die Alphabete konvertiert und warum scanf() ist nicht Akzeptieren space als ein Zeichen?

+0

Weg durch sie mit einem Debugger. Achten Sie auf den Wert von i - besonders in der Zeile, in der Sie eins davon abziehen und dann als Array-Index verwenden! –

+1

Warum benutzen Sie 'scanf', um einzelne Zeichen zu lesen? Weißt du, es kann die ganze Zeichenfolge lesen, oder? Lies auch 'man scanf', um zu verstehen, was es mit Leerzeichen macht. –

+0

Korrigieren Sie den Code richtig, damit Sie die logischen Fehler in Ihren if-Anweisungen sehen können. –

Antwort

5

In erster Linie kann man nicht Kette der logische OR-Operator wie

if(arr[i]==('A'||'a')) 

und bekommen, was Sie erwarten, da dies zu einer immer TRUE Bedingung aufgelöst wird. [('A'||'a') ergibt TRUE]

Sie haben

if ((arr[i]=='A') || (arr[i] =='a')) 

, das zu verwenden, sagte

  • ch[i]=='8';, ch[i]==1; sind im Grunde leer Aussagen. Sie vergleichen und verwerfen das Vergleichsergebnis. Wenn Sie eine Zuweisung wünschen, müssen Sie = verwenden.

  • die else ch[i]=arr[i]-32;nur bindet mit der vorherige if Aussage, nicht die ganzen ifKetten. Sie können entweder switch Fall oder if-else if-else Konstrukte verwenden, um sich um diesen Teil zu kümmern.

  • Sie haben Whitespaces nicht separat behandelt.


Um dies näher auszuführen, aufgrund des zweiten Punkt oben, Sie Code reduziert grundsätzlich

while(arr[i]!='\n') 
    { 
    if(arr[i]==('S'||'s')) //always false 
    ch[i]='5'; 

    else ch[i]=arr[i]-32; //always TRUE 
    i++; 
} 

, die nur ein schlechter Versuch ist Klein in Großbuchstaben zu umwandeln. Falls eine Nicht-Alpha-Eingabe in der Zeichenfolge vorhanden ist, wird der Code hochgejagt.

Das heißt, in Bezug auf die

warum scanf() als Charakter nicht akzeptieren Raum?

Teil akzeptiert scanf() perfekt ein Raum als eine Eingabe mit %c, ist es Sie wandeln es einfach keine NUL (null) von blind 32 von einem space subtrahiert, der ein ASCII value of decimal 32 hat. A NUL ist nicht druckbar und wird nicht in der Ausgabe angezeigt.

+2

Wahr, aber nur eines von vielen Problemen in diesem Code. –

+0

Danke für die Antwort. Obwohl mein Code falsch war, aber atleast 'e' sollte in' 3' konvertiert werden.Warum wird es nicht konvertiert? – user239887

+0

@sourav oops, dass versehentlich geschrieben wurde. Ich habe es bearbeitet, aber wieder bekomme ich das gleiche Ergebnis. – user239887

1

Einige Empfehlungen:

  • nicht viele kleine Anrufe scanf("%c"...) verwenden. Verwenden Sie fgets() (manpage). fgets liest eine ganze Zeile von der Eingabe ein, speichert sie in Ihrem Puffer (einschließlich der Zeilenumbrüche) und speichert ein '\ 0' Byte an dem Ende, damit Sie wissen, wie lang die Zeichenfolge ist.

  • Verwenden Sie toupper() (manpage). Es nimmt ein beliebiges Zeichen als Eingabe. Wenn die Eingabe ein Kleinbuchstabe ist, ist die Ausgabe die Großbuchstabeversion dieses Buchstabens. Ansonsten entspricht der Ausgang dem Eingang.

  • Aktualisieren Sie das Array an Ort und Stelle. Sie benötigen nicht zwei Arrays. Lies das Array mit fgets(), überschlinge es mit deiner Übersetzungslogik, aktualisiere jedes Zeichen wie du willst und schreibe das Array dann mit fputs() aus.

  • Erfahren Sie mehr über Schalteranweisungen. Eine switch-Anweisung macht Ihren Code kompakter und einfacher zu lesen. Sie brauchen einen Fall für jeden Buchstaben-> Zahlentransformation und einen Standardfall für alles andere.

    c = toUpper(c); 
    switch (c) { 
        case 'A': c = '4'; break; 
        case 'B': c = '8'; break; 
        .... 
        default: break; 
    } 
    
Verwandte Themen