2017-03-19 1 views
-2

숫자와 문자열 S를 입력으로 전달하려고합니다. 여기서 문자열 S는 이름 뒤에 쉼표가오고 그 뒤에 여러 자리 정수가옵니다. 프로그램은 해당 번호가 가장 높은 이름을 표시해야합니다. 출력쉼표로 구분 된 문자열로 이름과 정수 값을 읽는 방법은 무엇입니까?

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

하는 :

Mary 

메리에 대응하는 번호가 보낸 최대 인 56이다

입력을 고려한다.

내가 직면하고 문제 즉 여기

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 또는 realloc & free을 사용하여 약 C dynamic memory allocation을 읽기) 큰 변수 char W[200][1000];처럼. 나는 char**W; 것을 처리 할 것을 제안한다.

프로그램은 해당 번호가 가장 높은 이름을 표시해야합니다.

조금 더 생각해보십시오. 이전에 읽은 숫자를 모두 저장할 필요가 없으며 많은 메모리를 사용하지 않고 수백만 (이름, 점수) 줄의 파일을 처리 할 수 ​​있도록 프로그램을 설계해야합니다.

그런 다음 scanf("%[^\n]s",W[i]);이 아니며 원하는 것을 수행합니다. 을주의 깊게 읽고documentation of scanf (반환 값을 테스트하십시오). fgets 및 바람직하게는 getline을 사용하여 줄을 읽은 다음 구문 분석합니다 (아마도 sscanf).

그래서 기본적으로 쉼표 앞에있는 문자 배열과 쉼표 뒤에있는 숫자를 숫자 배열로 추출합니다.

표준 lexingparsing 기술을 사용하는 것을 고려해보십시오.

추신. 나는 네 숙제를하고 싶지 않아.

+0

예 나는 scanf와 사용할 수없는 사실에 동의합니다. 사실 fgets()로 시도 할 수 있습니다. Thanks @ Basile Starynkevitch –

+0

나는 malloc과 scanf() 포맷팅을 사용하는 솔루션을 가지고있다. 당신의 제안에 아주 좋을 것이다. @Basile Starynkevitch –

0

이 내 작업 코드입니다 : 나는 내가 scanf와을 (사용했다 dynamically.Also 문자열을 얻을 서식) 문자열의 내용을 저장할의 malloc을 사용하고 숫자 A의 한

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

별도의 array.But는 정말 좋은 것 같은 일에 더 나은 방법이 있는지.

+0

''(비표준)은 필요하지 않지만''은 표준)'malloc'과 친구들을 사용한다. –

+0

당신은 정말 scanf''의 결과를 테스트해야합니다 (이 검사 항목의 수입니다). '% n' 컨트롤을'scanf '로 사용하는 것이 유용 할 수도 있습니다. 마리아> 리드 "'로 인쇄되고 \ - 귀중한 정보 @Basile Starynkevitch.Will위한 –

+0

덕분 변경 –

관련 문제