2017-03-16 6 views
-4

저는 대학에서 과제물로 해산물 메뉴를 작성해야합니다. 여기서 I는 해당 코드를 제공한다 :% c 대 % s의 실질적인 차이

int main() 
{ 
int a,d; 
float c ; 
char b,s,S,m,M,l,L; 

printf ("\n\t\t\t\tSeafood Menu\n"); 
printf ("----------------------------------------------------------------------------------\n"); 
printf ("\t\t\t\t\t\t  Dish Size\n"); 
printf ("Item Number\t Seafood Dish\t  Small\t  Medium  Large\t\n"); 
printf ("----------------------------------------------------------------------------------\n"); 
printf ("\t 1\t Fried \t20.00 \t\t 40.00 \t\t 55.00\n"); 
    //Continue with a bunch of menu here 

    printf (" Enter item number   :"); 
    scanf ("%d",&a); 
    printf (" Enter dish size (S/M/L) :"); 
    scanf ("%s",&b); 


     if ((a==1)&&((b=='s')||(b=='S'))) 
     {c=20.00;} 
     //continue with a bunch of condition to choose the price per dish stated in the menu 


    printf (" Enter dish quantity  :"); 
    scanf ("%d",&d); 
    printf (" Price per dish size  :RM%.2f\n\n\n",c); 


return 0;  
} 

I는 % C까지의 형식이 식별자를 변경하려고 할 때, 그것은 단지 특정 scanf와의 입력을 받아들이 멈췄다.

printf ("Enter dish size (S/M/L):"); 
scanf ("%s",b); 

나는 이미지를 첨부하고 싶지만 내가 '두 개의 링크 떠날 것이다 : 나는 아무튼 이유에 대해 궁금

Normal, using %s:abnormal, using %c

을'그렇게 할 수 있지 않다 보인다 %c을 사용하고 %s을 사용하면 작동하지 않습니까? 내가 입력하는 모든 것은 문자 일 뿐이다. 제발 저를 계몽하십시오.

+4

두 변형 모두 정의되지 않은 동작을 호출합니다. 'scanf '문서와 문자와 문자 _ 문자의 차이점에 대해 읽어보십시오. C 문자열. – Olaf

+0

'% c'와'% s'의 동작은 당신의 편리한 C 레퍼런스 매뉴얼에서 명확하게 기술되어야합니다. 편리한 C 참조 설명서가 없으면 Harbison & Steele의 [C : A 참조 설명서] (http://careferencemanual.com)를 권합니다. '% c'는 입력 스트림에서 * 단일 문자를 읽고 그것을 하나의'char' 객체에 저장합니다. '% s'는 공백이나 EOF를 볼 때까지 입력 스트림에서 문자 값의 * sequence *를 읽고 0 종료 문자열로'char'의 * 배열 *에 저장합니다. –

답변

1

% s 작동 중에 % c를 사용하면 왜 작동하지 않는지 궁금합니다.

글쎄, 그것이 작동하지 않았다는 것을 짐작할 수 있습니다. scanf() 매뉴얼 페이지에서 언급했듯이

는 인수의 유형

  • %c

    char
  • %s 포인터가 char 어레이의 초기 요소에 대한 포인터를 기대 기대된다.

    c없이 필드 폭 경우 필드 폭 (1로 지정된 정확하게 숫자 문자 시퀀스와 일치 C11 챕터 §7.21.6.2 (강조 광산) 인용

이 지시문에 있음).

길이 수정자가없는 경우 해당 인수는 시퀀스를 허용 할만큼 큰 문자 배열의 초기 요소에 대한 포인터가됩니다. null 문자가 추가되지 않습니다.

s 비 공백 문자 시퀀스와 일치합니다. 더 l 길이 개질제가없는 경우

는, 해당 인자는 시퀀스를 수용하기에 충분히 큰 문자 배열의 초기 요소를 자동으로 추가 될 널 종료 문자에 포인터한다.하나의 char 배열을 스캔하고 저장하기에 하나 개의 요소가 너무 짧로 제공 %s 귀하의 경우에는

,

  • 그 null로 끝나는 것입니다, 잘못된 것입니다. 이로 인해 메모리 오버런이 발생하여 undefined behavior이 발생합니다. 입력 스트림이 키를 눌러 입력 이전에서 저장된 newline을 가지고 있지 않은 경우

  • %c을 가져야한다는 "를했다". 보류중인 모든 입력의 입력 스트림을 정리하면 작동하는 것으로 나타납니다. 동일한에 대한 자세한 내용은 당신은 내 this previous answer 볼 수 있습니다

    scanf(" %c", &b); //the whitespace "eats up" all the previous whitespaces 
    

    같은 것을 사용합니다.

+2

"'% s '은 여전히'char'에 대한 포인터를 기대하기 때문에'char' 배열에 대한 포인터는 오도 된 것입니다.'char' 배열에 대한 포인터가 아닙니다. 내 시스템의 man 페이지는 "문자 배열의 초기 요소에 대한 포인터"라고 말합니다. – Dmitri

+0

@Dmitri 관련 인용 부호를 추가하려면 필자의 시간을 보냈는데, 이것이 더 이상 오도하지 않기를 바랍니다. 감사. :) –

+0

@SouravGhosh 설명해 주셔서 감사합니다. 이것은 내 문제를 해결하는 데 도움이되었습니다. –