2014-09-14 2 views
0

좋아요. C에서 이름을 묻고 정렬하려고합니다. 코드를 완료했는데 오류없이 컴파일되었지만 문제가 있습니다. 대문자와 소문자가 혼합 된 문자를 입력 할 때 대문자가 먼저 정렬되고 순서는 정렬되지 않습니다. 내 코드는 어떻게해야합니까? 제발 도와주세요.C에서 문자열 조작?

코드 : 귀하의 거품에 대한

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

int main() 
{ 
    char name[30][25],temp[25]; 
    int i,j,n; 
    printf("Enter how many students : "); 
    scanf("%d",&n); 
    for(i=0;i<n;i++); 
    { 
     printf("Enter the name of the student : "); 
     scanf("%s",name[i]); 
    } 
    for(i=0;i<n;i++) 
    { 
     for(j=i+1;j<n;j++) 
     { 
      if(strcmp(name[i],name[j])>0) 
      { 
       strcpy(temp,name[i]); 
       strcpy(name[i],name[j]); 
       strcpy(name[j],temp); 
      } 
     } 
    } 
    printf("The sorted names are : \n"); 
    for(i=0;i<n;i++) 
    { 
     printf("%s\n",name[i]); 
    } 
    getch(); 
    return(0); 
} 
+1

짧은 입력과 해당 출력을 제공하십시오. 문제가 무엇인지 파악하는 데 도움이됩니다. –

+2

포인터의 배열을 사용해야하며,'qsort'를 사용하고 싶습니다. –

+1

비교하기 전에 문자열을 소문자로 변환 할 수 있습니까? – larsks

답변

1

스티치를 정렬 잘못 - 변경 :

for(i=0;i<n;i++) 
{ 
    for(j=i+j;j<n;j++) 
    { 

에 :

for(i=0;i<n-1;i++) 
{ 
    for(j=i+1;j<n;j++) 
    { 

또는 단지 표준 C에서 qsort를 사용 라이브러리를 다시 발명하려고 시도하는 것보다 엘자.

+0

왜 익명 다운 - 투표, 나는 궁금해? 위의 수정 사항에 문제가 있습니까? –

1

두 가지 옵션이 있습니다. 하나는 비교하기 전에 문자열을 더 낮게 (또는 위쪽으로) 변환하십시오. 둘째로 각 문자열을 strcol하면 k가 K 등의 옆에 놓입니다. 두 방법 모두 파괴적이므로 작업 문자열을 생성하고 비교 한 후 해방해야합니다.

+0

표준 대소 문자를 구별하지 않는 문자열 비교 함수 (POSIX에서는'strcasecmp()', Windows는'stricmp()', IIRC)를 사용할 수도 있습니다. 'strcoll()'(두 개의'l')을 사용하는 것은 흥미로운 아이디어입니다; 그것은 파괴적이지 않습니다. 'strxfrm()'함수는 흥미로운 함수이며, 심지어 비파괴적인 함수입니다. –

0

우선 프로그램이 잘못되었습니다.

scanf("%s",&name[i]); 

예를 들어 대신

scanf("%s", name[i]); 

또는이 문 초기화되지 않은 변수 J가 사용된다

for(j=i+j;j<n;j++) 

에서이 있어야한다. 다음 헤더에 선언 된 표준 C 함수 toupper를 사용하여 대문자로 문자열을 변환해야합니다 귀하의 질문에 관해서는

<ctype.h>

또한 이름 [j]가보다 작은 경우 문자열 매번 복사하지 않고 선택 정렬을 사용하는 것이 좋습니다 이름 [i].

+1

'아니야, 틀렸어. – starrify

+0

@starrify 그리고 무엇이 잘못 되었나요? –

+1

@ starrify & name [i]과 name [i]의 차이점과 그 유형은 무엇입니까? –

0

여러 오류 : 당신이 당신의 유스 케이스에 대한 잘못 비교 설명

은 세미콜론으로 for 루프를 종료하지 않는

for(i=0;i<n;i++); 

이러한 변수

for(i=0;i<n;i++) 
{ 
    for(j=i+1;j<n;j++) 
    { 

에서 두 번째를 살펴

if(strcmp(name[i],name[j])>0) 

가능한 해결책은 다음과 같습니다.

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

char * Inputs[] = 
{ 
    "3\n", 
    "Carl\n", 
    "Frank\n", 
    "carl\n" 
}; 

int in = 0; 


int main() 
{ 
    char name[30][25],temp[25]; 
    int i,j,n; 
    printf("Enter how many students : \n"); 
    sscanf(Inputs[in++],"%i",&n); 
    printf("You entered : %i\n", n); 
    for(i=0;i<n;i++) 
    { 
     printf("Enter the name of the student : \n"); 
     sscanf(Inputs[in++],"%s",&name[i]); 
     printf("You entered : %s\n", name[i]); 
    } 
    for(i=0;i<n-1;i++) 
    { 
     for(j=i+1;j<n;j++) 
     { 
      if(stricmp(name[i],name[j])>0) 
      { 
       strcpy(temp,name[i]); 
       strcpy(name[i],name[j]); 
       strcpy(name[j],temp); 
      } 
     } 
    } 
    printf("The sorted names are : \n"); 
    for(i=0;i<n;i++) 
    { 
     printf("%s\n",name[i]); 
    } 
    getch(); 
    return(0); 
}