2016-06-03 5 views
0

특정 질문을하고 사용자가 읽고있는 Y/N 답변을 얻고 싶습니다. 캐릭터 Y 또는 N을 사용하여 다음 질문의 결과를 변경해야합니다. 따라서 캐릭터를 저장해야 나중에 검색 할 수 있습니다. 문자열이나 for/while 루프를 사용하고 싶지 않습니다. 또한 "% c *"다음에 *를 포함해야하는 이유는 무엇입니까?Scanf Y/N 및 향후 사용을 위해 저장

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
int avgTemp, lowestTemp, temperature; 
char choice ='Y'; 
char decision ='N'; 
printf("What is the average temperature?\n"); 
    scanf("%d", &avgTemp); 

printf("What is the lowest temperature in last 24 hours?\n"); 
    scanf("%d", &lowestTemp); 

printf("Has the temperature been over 99 degrees F for more than 30 minutes? 
     Please answer Y for yes and N for no.\n"); 
    scanf("%c*", &choice); 

printf("choice is %c", choice); 

return 0; 
} 
+0

나중에 저장되도록 저장했다고 말하면 지속성을 의미합니까? 응용 프로그램이 이전 값을 알아야 할 때마다 읽을 수있는 문자 파일에 문자를 쓸 수 있습니다. – Sterls

+0

방금 ​​추가 한 마지막 printf 문에서 나중에 사용하도록 저장되었습니다. 그것이 인쇄 할 수있는 모든 것은 "선택"입니다. 나는 그것을 할 수 있다면 선택의 편지를 인쇄하고 싶습니까? –

+0

즉, '선택'에 잘못된 문자를 저장하고 있음을 의미합니다. 문자를 입력 한 직후에 Return 키를 누르십시오. 해당 scanf에서'*'대신 공백을 넣으십시오. – usr2564301

답변

3

또한, 내가 왜 "% C 형 *"후 *를 포함해야합니까?

%c*은 문자를 검색 한 다음 * (삭제할 것임)을 의미합니다. 어쩌면 %*c을 의미하는 것은 검사를하지만 파기한다는 의미입니다. 당신은 그들 중 어느 것도 필요로하지 않습니다.

scanf은 매우 문제가있는 기능이므로 피해야합니다. 프로그램에 문제가 설명되어 있습니다. scanf은 전체 행을 읽지 않습니다. scanf에 대한 질문에 stdin까지만 검색 한 다음을 중지합니다. 이것은 여분의 입력을 의미하며 때로는 newlines가 입력 스트림에 남을 수 있으므로 다음 의심이없는 scanf에 대해 남을 수 있습니다. 매뉴얼 페이지에서 ...

각 연속적인 포인터 인수는 각 연속 변환 지정자와 올바르게 대응해야합니다 (단, 아래의 * 변환 참조). 모든 변환은 % (퍼센트 기호) 문자로 시작됩니다. 형식 문자열에는 다른 문자가 포함될 수도 있습니다. 형식. 자열의 공백 (예 : 공 i, 탭 또는 줄 바꿈)은 입력에 공백이없는 공백을 과 일치시킵니다. 그 외 모든 것은 과 일치합니다. 입력 문자가 형식 문자와 일치하지 않으면 스캔이 중지됩니다. 또한 입력 변환이 불가능한 경우 스캔이 중지됩니다 (아래 참조).

이렇게하면 매우 인풋 버퍼에 실수로 쉽게 문자를 남길 수 있습니다. 각 scanf("%d")은 번호를 읽고 중지합니다. 이렇게하면 입력 버퍼에 개행 문자가 남습니다. 이것은하지만 %c 용 변환을 시작하기 전에, 대부분의 전환이 공백

를 건너 %d

... 때문에위한 괜찮습니다.

일련의 너비 개수 문자 (기본값 1)와 일치합니다. 다음 포인터는 char에 대한 포인터 여야하며 모든 문자에 대해 충분한 공간이 있어야합니다 (종료 NUL이 추가되지 않음). 일반적인 공백 건너 뛰기가 억제됩니다. 먼저 공백을 건너 뛰려면 형식에서 명시적인 공백을 사용하십시오.

그래서 당신은 전혀 작동하도록 scanf(" %c")이 필요합니다. 예기치 않은 입력에 매우 취약하기 때문에


scanf

피해야하는 것입니다. 첫 번째 질문에 "foo"라고 말해보십시오. scanf("%d")은 모두 자동으로 실패합니다. scanf("%c")f입니다.

대신 전체 줄을 getline (사용자를 위해 메모리 할당을 처리 할 때 사용함) 또는 fgets으로 읽은 다음 결과 문자열에 sscanf을 사용하십시오. 이렇게하면 위의 모든 문제를 피할 수 있습니다.

+1

' "% c *"'는 문자를 스캔 한 다음 문자'*'를 스캔하는 것을 의미합니다. "*는 스캔을 의미하지만 그것을 버리는 것을 의미하지는 않습니다." ''% * c "' – chux

+1

@chux를 의미 할 것입니다. 고마워요, 고마워요. 좋은 토론을 위해서 – Schwern

+0

UV. (비록 자원 착취에 취약한'getline()'의 팬이 아니지만) – chux

관련 문제