2017-03-19 11 views
-2

数字と文字列Sのセットを入力として渡そうとしています。ここでは、文字列Sには名前の後にカンマが続き、その後に複数の数字の整数が続きます。プログラムは、対応する最高番号の名前を表示する必要があります。カンマ区切りの文字列で名前と整数値を読み取る方法は?

は、入力を考えてみましょう:出力のため

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

Mary 

メアリーに対応する数が最も高い56であるから。

私が直面しています問題は、ここでは2列に、すなわち

w[][] a[][] 

を名前と電話番号を取得することです私は2次元配列を試してみましたが、私はカンマ区切りの値を読み取ることができないのです。だから、基本的に私は、文字配列にコンマと番号の配列にコンマの後の数字の前に名前を抽出したい

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

: これは私のコードです。

このコードを修正するにはどうすればよいですか?

答えて

1

一般的なアドバイスは:ヒープに割り当てられた値を好む(及びmalloc又はreallocfree &を使用し、約C dynamic memory allocationを読み取る)char W[200][1000];ような大きな変数に。私はchar**W;ものを扱うことを提案します。

プログラムでは、対応する番号が最も高い名前を表示する必要があります。

もう少し考えてみてください。これまでに読み込んだすべての数値を保存する必要はなく、数百万(名前、スコア)行のファイルを処理できるようにプログラムを設計する必要があります。

次に、scanf("%[^\n]s",W[i]);ではありません。あなたがしたいことをしています。 をよく読んでdocumentation of scanf(戻り値をテストしてください)。 fgetsと、好ましくはgetlineを使用してください。行を読み、解析します(おそらくsscanf)。

基本的に、カンマの前に文字配列を、カンマの後に数字を数値配列に展開します。

標準lexingparsingの技術を、おそらくすべてのラインで使用することを検討してください。

PS。私はあなたの宿題をしたくありません。

+0

はい私はscanfを使用できないという事実に同意します。確かに私はfgets()で試すことができます。ありがとう@Basile Starynkevitch –

+0

私はmallocとscanf()の書式設定を使った解決策を持っています。あなたの提案には大変役に立つでしょう@Basile Starynkevitch –

0

は、これは私の作業コードです:

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

私は(scanf関数を使用しているdynamically.Also文字列の内容を保存するためのmallocを使用している)内の文字列や数値を取得するためにフォーマットするとしかし、同じことをするより良い方法があるなら、それは本当に素晴らしいでしょう。

+0

''(これは非標準です)ではなく ''標準)を使用して 'malloc'と友人を使用します。 –

+0

あなたは本当に 'scanf'の結果を調べるべきです(スキャンした項目の数です)。 '%n'コントロールを' scanf'に使用すると便利です。 –

+0

貴重な情報をお寄せいただきありがとうございます@Basile Starynkevitch.Will do the changes –

関連する問題