2016-08-26 5 views
-5

안녕하세요, 입력으로 요소를 가져 오는 동안 두 개의 입력을받는 이유를 알 수 없습니다. TurboC 컴파일러, GCC에서이 코드를 시도했지만 동일한 오류가 발생했습니다.오류 입력을 가져 오는 중

#include <stdio.h> 


int menu(); 
void bubble_short(); 
void selection_short(); 

int main() 
{ 
    int ch,j,n,a[100]; 

    ch=menu(); 

    switch (ch) 
    { 
      case 1: 
        { 
         bubble_short(); 
         break; 
        } 
      case 2: 
        { 
         selection_short(); 
        } 
      default : 
        break; 
     } 
} 

void bubble_short() 
{ 
    int i,j,n,a[100]; 
    printf("Elements"); 
    scanf("%d",&n); 
    for (j=0; j<n;j++) 
    { 
     scanf("%d",&a[j]); 
    } 
    for (i=0;i<n;i++) 
    { 
     for (j=0;j<n-1-i;j++) 
     { 
      if (a[j]>a[j+1]) 
      { 
       a[j]=a[j]+a[j+1]; 
       a[j+1]=a[j]-a[j+1]; 
       a[j]=a[j]-a[j+1]; 
      } 
     } 
    } 

    printf("the sorted elements are :\n"); 
    for (i = 0; i < n; i++) 
    { 
     printf("%d\n",a[i]); 
    } 
} 


void selection_short() 
{ 
    int i,j,n,a[100],min; 
    printf("Elements"); 
    scanf("%d",&n); 
    for (i = 0; i <n-1; ++i) 
    { 
     min=i; 
     for (j = 1+i; i < n; ++i) 
     { 
      if(a[min]>a[j]) 
       min=j; 
     } 
     if(i!=min) 
     { 
      a[i]=a[i]+a[min]; 
      a[min]=a[i]-a[min];; 
      a[i]=a[i]-a[min];; 
     } 
    } 

    printf("the shorted elements are :\n"); 
    for (i = 0; i < n; ++i) 
    { 
     printf("%d\n",a[i]); 
    } 
} 

int menu() 
{ 
    int k; 
    printf("Enter the choice \n 1. bubble short \n 2. selectionshort"); 
    scanf("\n %d ",&k); 
    return k; 
} 

안녕하세요, 입력으로 요소를 가져 오는 동안 두 개의 입력을받는 이유를 알 수 없습니다. TurboC 컴파일러, GCC에서이 코드를 시도했지만 동일한 오류가 발생했습니다.

출력

enter image description here

+1

'무효 bubble_short (INT의 N)'->'무효 bubble_short (무효)' – BLUEPIXY

+0

그 오류가 무엇인지? 너가 설명하면 너는 동일한 과실을 두번 얻는다. 우리가 당신 자신의 것으로 그것을보기 위해 당신의 장소에 가기를 바라십니까? 여기에 넣는 것이 더 쉬울 것이고 그것을 읽도록하겠습니다. –

+0

여기에 C 파일을 첨부하고 있습니다. scanf가 printf보다 먼저 실행되는 이유를 모르겠습니다. 나는 여기에 완전한 코드를 붙이고있다. 그것을 실행 한 후에는 오직 하나의 입력을 받아 들여야하는데 2를 가져 가고 마지막 하나는 두 번째 scanf입니다. – akashmagrawal

답변

1

가 문제를 얻었다!

scanf 내에 줄 바꿈, 공백, 탭 및 리턴 캐리지를 사용하면 이러한 문제를 방지하고 좋은 코딩 지침을 유지할 수 있습니다! 이것들은 그것을위한 구분자 (delimiter)의 역할을하며 여러분은 그것들 중 3 개를 제공했다.

편집이 당신의 메뉴는 scanf : -

scanf("%d",&k); 

뒤에 기본 논리 : - 기본 예제 촬영이 : -

scanf("%d %d", &i, &j); 

주의 그 공간 둘 사이에 자리. 이것을 실행하면 첫 번째 입력을 취한 다음 키보드에서 해당 구분 기호가 읽힐 때까지 기다린 후 입력의 두 번째 매개 변수를 읽습니다.

프로그램의 나머지 부분은 잘 실행되어야한다고 생각합니다. menu() 기능에

+0

"감사합니다"는 나를 위해 일했습니다. 이 기본 개념을 주셔서 감사합니다. – akashmagrawal

+0

환영합니다. –

1

, 당신은 : 필요하지 않은

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

선행 공백 문자합니다 ('\n'' '을); %d은 공백을 앞서는 부분을 건너 뛰고 하나만 있으면 충분합니다. scanf() 외 형식 문자열의 각 공백 문자는 입력에서 0 개 이상의 공백 문자에 매핑됩니다.

뒤 공백이 잘못되었습니다. 0 개 이상의 공백 문자 (개행, 공백, 탭)를 건너 뛰고 공백 문자가 아닌 (또는 EOF까지) 무언가를 볼 때까지 계속 진행하는 것을 의미합니다. 형식 문자열에서 공백 문자가 뒤 따르는 것은 나쁜 생각입니다. 입력이 상호 작용한다고 가정 할 때 두 배입니다. 현재 입력을 종료하기 전에 다음 입력이 무엇인지 예측해야합니다. 이는 사람들이하기 쉽지 않습니다.


다른 여러 문제가 있습니다. 함수 선언은 프로토 타입이 아닙니다 (C에서 프로토 타입을 만들려면 int menu(void); 등을 작성해야합니다). case 2: 이후 휴식을 놓치고 있습니다. 현재로서는 아무런 해가 없지만 오류 메시지 나 다른 정렬 옵션을 시스템에 넣으면 문제가됩니다. 충분한 기능을 사용하지 않았습니다 : 배열 읽기 기능과 배열 인쇄 기능이 있어야하며이를 사용해야합니다. selection_short() 함수에서 데이터 읽기 루프를 빠져 나왔습니다. 일반적으로 사용되는 용어는 short이 아니라 sort입니다. 함수 이름은 대부분의 사람들에게 이상하게 보입니다.

스왑 알고리즘은 뒤틀린입니다 :

a[i]=a[i]+a[min]; 
a[min]=a[i]-a[min];; 
a[i]=a[i]-a[min];; 

당신은 이중 세미콜론이 필요하지 않습니다. 값이 충분히 크면 오버플로의 위험을 감수해야합니다.

int tmp = a[i]; 
a[i] = a[min]; 
a[min] = tmp; 

당신은 그것이 실패 할 경우 적절한 조치를 복용, 성공 수 있도록 각각의 모든 scanf() 전화를 확인해야합니다 : 사용 - 궁극적으로 안전한 - 그것은 간단하고 훨씬 더 정통이다. 0 또는 EOF을 반환하면 실패 할 수 있습니다. 당신은 테스트해야합니다 :

if (scanf("%d", &n) != 1) 
    …oops… 
+0

제 실수를 지적 해 주신 Jonathan Leffer에게 감사드립니다 ... 나는 초심자이며 반드시 당신의 요점을 명심하십시오. – akashmagrawal