Scanf 연속 호출 여러 번 및% c 문제 가 있 습 니 다.
프로그램 에 여러 개의 scanf 가 존재 할 때 첫 번 째 scanf 의 입력 에 대해 일반 사용 자 는 공백 문자 (빈 칸, 줄 바 꾸 기, tab, 페이지 바 꾸 기) 등 으로 끝 납 니 다.그러나 뒤에 scanf ("% c", & ch) 가 있 으 면 방금 입력 한 공백 문 자 는 이번 scanf 에 의 해 읽 히 기 때문에 공백 문자 도 하나의 문자 로 ch 가 비어 있 습 니 다.
원인 설명:
scanf 의 작업 원리: (일반적인 상황, 즉 형식 문자열 에 다른 문자 가 없 음) 사용자 의 입력 은 버퍼 에 저 장 됩 니 다. scanf 가 있 을 때 scanf 는 이 버퍼 대기 열 에서 문 자 를 읽 습 니 다. 공백 문자 나 이 문자 가 이번 입력 이 불가능 할 때 까지 이 문 자 를 원래 대기 열 에 다시 놓 습 니 다. 이 문 자 는 대기 열의 첫 번 째 문자 가 됩 니 다.현재 scanf 가 호출 될 때 첫 번 째 문자 에서 읽 습 니 다. 이 때% d,% f,% g,% e 등 데이터 형식 문자열 이 라면 숫자 가 나 올 때 까지 공백 문 자 를 건 너 뛸 수 있 습 니 다.이 때% c 등 문자 (문자열) 형식 문자열 이면 공백 문 자 를 읽 고 이 변수 에 값 을 부여 합 니 다.
또한 이 형식 문자열 이 대표 할 수 없 는 문 자 를 읽 으 면 프로그램 이 이상 하 게 종 료 됩 니 다.scanf ("% d", & num) 와 같은 경우 kk 를 입력 하 십시오.
해결 방법:
형식 문자열 의 일반 문 자 를 처리 합 니 다. scanf 가 취 하 는 동작 은 이 문자 가 공백 문자 인지 여부 에 의존 합 니 다.
l 공백 문자: 형식 문자열 에서 하나 이상 의 연속 적 인 공백 문 자 를 만 났 을 때 scanf 는 입력 에서 공백 문 자 를 반복 해서 읽 습 니 다.형식 문자열 의 공백 문자 수 는 중요 하지 않 습 니 다. 형식 문자열 의 공백 문 자 는 입력 한 임의의 수량 (0 개 포함) 의 공백 문자 와 일치 할 수 있 습 니 다.
l 다른 문자: 형식 문자열 에서 비 공백 문 자 를 만 났 을 때 scanf 는 다음 입력 문자 와 비교 합 니 다.두 글자 가 일치 하면 scanf 는 입력 문 자 를 포기 하고 형식 문자열 을 계속 처리 합 니 다.두 글자 가 일치 하지 않 으 면 scanf 는 일치 하지 않 는 문 자 를 입력 에 넣 고 이상 하 게 종료 합 니 다.예 를 들 어 scanf ('% d /% d, & a, & b) 는 입력 이 5 / 96 이면 a = 5, b = 96 이다.
요약:
(1) 형식 문자열 에 다른 문자 가 없 으 면 이 변수의 모든 입력 일 수 있 습 니 다. 이 변수의 입력 이 아 닐 때 까지 읽 습 니 다. 또한 문자 형식 이 아 닌 형식 문자열 (예 를 들 어% d,% f,% g,% e) 은 모든 공백 문 자 를 건 너 뛰 어 첫 번 째 문자 입력 을 찾 지만 문자 형식의 형식 문자열 (예 를 들 어% c) 은 공백 문 자 를 건 너 뛰 지 않 습 니 다.
(2) 형식 문자열 에 다른 문자 가 있 으 면 공백 문자 와 비 공백 문자 로 나 누 어 토론 합 니 다.
따라서 상기 문 제 는 scanf ("% c", & ch) 로 해결 할 수 있 습 니 다.
#include <stdio.h>
int main(void){
int cmd;
char ch;
float balance=0.0f, credit, debit;
for(;;){
printf("What do you want to do? 1:credit 2:debit 3:balance 4:exitn");
scanf(" %d",&cmd);
switch(cmd){
case 1:
printf("Enter amount of credit: ");
scanf("%f",&credit);
balance+=credit;
credit=0.0f;
break;
case 2:
printf("Enter amount of debit: ");
scanf("%f",&debit);
balance-=debit;
debit=0.0f;
break;
case 3:
printf("The banlance of your acoount is: %fn", balance);
break;
case 4:
printf("Exit confirm:(y/n)");
scanf(" %c",&ch);// , 。
if(ch=='y')return 0;
else if(ch=='n')break;
else {
printf("Error command.n");
break;
}
break;
default:
printf("Error command.n");
break;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.