2017-03-19 2 views
-2

Ich versuche, eine Zahl und eine Reihe von String S als Eingabe zu übergeben. Hier enthält die Zeichenfolge S einen Namen, gefolgt von einem Komma und dann gefolgt von einer ganzen Zahl. Das Programm muss den Namen mit der höchsten entsprechenden Nummer anzeigen.Wie lese ich einen Namen und einen Integer-Wert in einer durch Kommas getrennten Zeichenfolge?

Betrachten wir die Input:

4 
Will,13 
Bob,7 
Mary,56 
Gail,45 

, für die der Output:

Mary 

da die Anzahl an Mary entspricht 56 ​​ist, die die höchste ist.

Das Problem, das ich bin vor ist der Name und die Nummer in zwei Arrays nämlich habe ich versucht, zweidimensionale Arrays

w[][] a[][] 

hier zu bekommen, aber ich bin nicht in der Lage, die durch Komma getrennte Werte zu lesen. Das ist mein Code:

#include <stdio.h> 
#include <ctype.h> 
int main(){ 
char W[200][1000];//Two dimensional arrays to store names 
int a[200];//To store the numbers 
int i,n; 
scanf("%d",&n);//Number of Strings 
for (i=0; i<n; i++) { 
    scanf("%[^\n]s",W[i]);//To read the name 
    getchar();//To read the comma 
    scanf("%d",&a[i]);//To read the number 
} 
printf("\n"); 
for (i=0; i<n; i++) { 
    printf ("W[%d] = %s a[%d] = %d\n" ,i,W[i],i,a[i]);//Displaying the values 
} 
//To find out the maximum value 
max = a[0]; 
for(i=0;i<n;i++){ 
    if(a[i]>=max) { a[i] = max; pos = i; } 
} 
printf("\n%s",W[pos]); //Print the name corresponding to the name 
return(0); 
} 

Also im Grunde möchte ich vor dem Komma, den Namen extrahieren in das Zeichenfeld und die Zahl nach dem Komma in die Anzahl Array.

Wie kann ich diesen Code korrigieren?

Antwort

1

Eine allgemeine Beratung: lieber Heap zugewiesen Werte (und verwenden malloc oder realloc & free, etwa C dynamic memory allocation lesen) bis hin zu großen Variablen wie char W[200][1000];. Ich schlage vor, eine char**W; Sache zu behandeln.

Das Programm muss den Namen mit der höchsten entsprechenden Nummer anzeigen.

Denken Sie ein bisschen mehr. Sie müssen nicht alle zuvor gelesenen Zahlen speichern, und Sie sollten Ihr Programm so gestalten, dass es in der Lage ist, eine Datei mit vielen Millionen Zeilen (Name, Score) zu verarbeiten (ohne viel Speicher zu verbrauchen).

Dann ist scanf("%[^\n]s",W[i]);nicht tun, was Sie wollen. Lesen Sie vorsichtigdocumentation of scanf (und testen Sie den Rückgabewert). Verwenden Sie fgets - und vorzugsweise getline, wenn Sie es haben - eine Zeile zu lesen, dann analysieren Sie es (vielleicht mit sscanf).

Also im Grunde möchte ich den Namen vor dem Komma in das Zeichenfeld und die Zahl nach dem Komma in das Zahlenfeld extrahieren.

Betrachten Standard lexing und parsing Techniken, vielleicht auf jeder Zeile.

PS. Ich will deine Hausaufgaben nicht machen.

+0

Ja, ich stimme zu, dass das scanf nicht verwendet werden kann. In der Tat kann ich es mit fgets() versuchen. Danke @Basile Starynkevitch –

+0

Ich habe eine Lösung mit malloc und scanf() Formatierung.Es wäre großartig für Ihren Vorschlag @Basile Starynkevitch –

0

Das ist mein Arbeitscode:

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
char *str[100]; 
int i,a[100]; 
int num=100;//Maximum length of the name 
int n,max,pos; 
scanf("%d",&n);//Number of strings 
for(i=0;i<n;i++) 
{ 
    str[i]=(char *)malloc((num+1)*sizeof(char));//Dynamic allocation 
    scanf("%[^,],%d",str[i],&a[i]); 
} 
max = a[0]; 
pos = 0; 
for(i=1;i<n;i++){ 
    if(a[i]>max) {max = a[i]; pos = i;} 
} 
printf("%s\n",str[pos]);//Prints the name corresponding to the greatest value 
return 0; 
} 

Ich habe malloc verwendet den Inhalt der Zeichenfolge speichern dynamically.Also ich die scanf verwendet haben() mit der Formatierung der Zeichenfolge und die Zahlen in eine bekommen seperate array.Aber wenn es einen besseren Weg gibt, das gleiche zu tun, wäre es wirklich großartig.

+0

Sie brauchen nicht '' (was nicht-Standard ist) aber '' (was ist Standard), um 'malloc' und Freunde zu benutzen. –

+0

Sie sollten wirklich das Ergebnis von 'scanf' testen (es ist die Anzahl der gescannten Elemente). Übrigens könnte das '% n'-Steuerelement für' scanf' nützlich sein. –

+0

Danke für die wertvollen Informationen @Basile Starynkevitch.Will machen die Änderungen –

Verwandte Themen