2016-12-28 2 views
-4

Eigentlich vor kurzem fand ich ein Problem, wo ich Auftreten eines gegebenen (durch oj) char in einer gegebenen Zeichenfolge (mit Testfall) zählen muss. So schreibe ich diesen Code aber Ausgabe ist nicht so, wie ich es wünsche.Ich bin ein Anfänger, also werde ich sehr dankbar für jede Art von lehrreichen Rat oder Hilfe sein.geting Eingabe von String und Zeichen in einer Schleife auf c

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
    int ara [123]; 
    char s[1000]; 
    int l, j, i, len; 
    char c; 

    scanf ("%d\n", &l); 

    while (l >= 0){ 

     for (i = 65; i <= 122; i++) 
     { 
      ara[i] = 0; 
     } 

     fgets(s, 1000, stdin); 
     len = strlen(s); 

     for (i = 0;i <= len; i++) 
     { 
      ara[s[i]]++; 
     } 

     scanf(" %c\n", &c); 
     j = c; 
     printf("count : %d\n", ara[j]); 

     l--; 
    } 

    return 0; 
} 
+0

Willkommen bei Stack-Überlauf. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

+0

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

Wenn eine der geposteten Antworten Ihr Problem löst, denken Sie bitte daran, es zu akzeptieren. Das hilft uns allen zu wissen, dass keine weiteren Maßnahmen erforderlich sind. – 4386427

Antwort

1

Das Problem ist, dass scanf ein newline im Eingang verlassen als Ziel Satz gelesen werden.

Sie können dies umgehen, indem Sie stattdessen fgets und sscanf verwenden. Ich habe auch einige Hinweise hinzugefügt, um es einfacher zu wissen, was erwartet wird.

#include <stdio.h> 
#include <string.h> 

int main (void) 
{ 
    int ara [128];       // increased array size 
    char s[1000]; 
    char t[10]; 
    int l, j, i, len; 
    char c; 

    printf("Enter how many loops:\n"); 
    fgets(t, sizeof t, stdin);    // replace scanf 
    sscanf (t, "%d\n", &l);     // with sscanf 

    while (l > 0){       // changed end test 

     for (i = 'A'; i <= 'z'; i++)  // replaced magic numbers 
     { 
      ara[i] = 0; 
     } 

     printf("Enter the string:\n"); 
     fgets(s, sizeof s, stdin); 
     len = strlen(s); 

     for (i = 0;i <= len; i++) 
     { 
      ara[s[i]]++; 
     } 

     printf("Enter the letter:\n"); 
     fgets(t, sizeof t, stdin);   // replace scanf 
     sscanf (t, "%c\n", &c);    // with sscanf 
     j = c; 
     printf("count : %d\n", ara[j]); 

     l--; 
    } 

    return 0; 
} 

Programmsitzung

 
Enter how many loops: 
2 
Enter the string: 
one two three four 
Enter the letter: 
o 
count : 3 
Enter the string: 
three seven 
Enter the letter: 
e 
count : 4 

Beachten Sie, dass im Idealfall sollten Sie auch die Funktion Rückgabewerte von fgets und sscanf überprüfen.

+1

Ich habe meine eigene Antwort geschrieben, als diese Antwort gepostet wurde. Jetzt sehe ich keinen Grund mehr, meinen zu posten, da das Prinzip das gleiche ist. Aber es gibt ein paar Dinge, die meiner Meinung nach hinzugefügt werden sollten: 1) Initialisiere das ganze 'ara'-Array. Zur Zeit hat dieser Code UB. Die zusätzliche Zeit, die benötigt wird, um alles zu initialisieren, spielt in einem Programm, das von stdin liest, keine Rolle. 2) Überprüfen Sie den Wert von "j" in Bereich, bevor Sie es für die Indizierung in "ara" – 4386427

+1

und 3) verwenden. Überprüfen Sie den Wert von 's [i]' vor dem Indexieren in 'ara' – 4386427

+1

@ 4386427 danke, nur ich erwähnte Fehlerprüfung am Ende. Das Array könnte 256 Elemente und mit 'unsigned char'-Eingabe gehabt haben.Es gab einige andere Dinge, die ich hätte erwähnen können, aber ich wollte die Antwort nah an der Frage halten, nicht eine vollständige Neufassung machen. –

0

In Ihrem Programm verwenden Sie diesen Code, wenn Sie den Character-Wert lesen, dann wird Ihr Code gut funktionieren.

scanf(" %c", &c); 
//flushes the standard input (clears the input buffer) or discard extra characters 
int etc_ch; 
while ((etc_ch=getchar()) != '\n' && etc_ch != EOF); 

Hinweis

Sie auch fseek(stdin,0,SEEK_END); verwenden können, den Eingangspuffer insted während

Schleife

Verwenden Sie dieses Programm löschen es unter jeder Bedingung für jede Art von Arbeit wird Zeichenkette. im Allgemeinen gibt es 256 ASCII-Zeichen in c.

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
    int ch_arr[256]; //255 charcters in c 
    char string[1000]; 
    int test, j, i, len; 
    char ch='a'; 

    //printf("\nEnter the no of test cases :"); 
    scanf("%d\n",&test); //store test cases values 

    while(test>0) 
    {  
     for(i=0;i<256;i++) 
     ch_arr[i]=0; 
     //printf("\nEnter string input :"); 

     fgets(string, 1000, stdin); 

     len = strlen(string); 

     for (i = 0;i<len; i++) 
     { 
      ch_arr[string[i]]++; 
     } 

     scanf(" %c",&ch); 

     // flushes the standard input (clears the input buffer) 
     int etc_ch; 
     while ((etc_ch=getchar()) != '\n' && etc_ch != EOF); 

     j = ch; 
     printf("count : %d\n", ch_arr[j]); 

     test--; 
    } 
    return 0; 
} 

Ausgabe des obigen Programms:

2 
abcde 
a 
count : 1 
@#$% 
@ 
count : 1 
+0

Wenn Sie die restlichen Zeichen im Eingabestrom verwerfen, müssen Sie ebenfalls nach'EOF' suchen, um eine Endlosschleife zu vermeiden. Beachten Sie, dass 'getchar()' '' EOF 'im Falle eines Fehlers zurückgibt, und Benutzer können auch ein' EOF' Zeichen eingeben. –

+0

Vielen Dank für Ihren Vorschlag ..... 'while ((getchar())! = '\ N' && (getchar())! = EOF);' Code wird gut funktionieren. Und Sie können auch ** fseek (stdin, 0, SEEK_END); ** an der Stelle von getchar() verwenden, um den Eingabepuffer zu löschen. –

+0

Sie wollen nicht 2 Aufrufe von 'getchar()' in einer Zeile wie dieser: 'int ch; while ((ch = getchar())! = '\ n' && ch! = EOF) continue; 'Dies ist der richtige Weg, um dieses allgemeine Idiom zu implementieren. Meine Erinnerung ist, dass es keine Garantie gibt, dass Tastatureingabe zu "stdin" wahlfrei ist (und daher suchbar). Ich würde mich freuen, darüber falsch zu sein :) –