C에서 단일 문자를 스캔하는 방법
C: 사용자로부터 char를 취득하려고 합니다.scanf
프로그램을 실행하면 사용자가 아무것도 입력하기를 기다리지 않습니다.
코드는 다음과 같습니다.
char ch;
printf("Enter one char");
scanf("%c", &ch);
printf("%c\n",ch);
왜 안 되지?
%c
선행에 (를 들어에서) 뉴라인이, "" (": "Newline")는 "Newline"을 사용합니다.scanf
콜이 즉시 소비됩니다.
이 문제를 회피하는 방법 중 하나는 변환 지정자 앞에 공백을 넣는 것입니다.
scanf(" %c", &c);
형식 문자열의 공백은 다음을 나타냅니다.scanf
번째 이 없는는 공백이 아닌 첫 . 을 사용하다%c
변환 지정자.
피하세요, 피하세요.scanf()
고통받을 가 없어 그것을 사용하는 것은 수고를 들일 가치가 없다.
참조: 왜 모두 scanf를 사용하지 말라고 합니까? 대신 무엇을 사용하면 좋을까요?
scanf()
입력 스트림에 남아 있는 공백 문자는 무시됩니다. 더 많은 입력을 읽어야 할 경우 어떻게 해야 합니까?★★★★★★★★★★★★★★★★★★:
#include <stdio.h>
int main(void)
{
char ch1, ch2;
scanf("%c", &ch1); /* Leaves the newline in the input */
scanf(" %c", &ch2); /* The leading whitespace ensures it's the
previous newline is ignored */
printf("ch1: %c, ch2: %c\n", ch1, ch2);
/* All good so far */
char ch3;
scanf("%c", &ch3); /* Doesn't read input due to the same problem */
printf("ch3: %c\n", ch3);
return 0;
}
세 번째 scanf()는 선행 공백으로 동일한 방법으로 수정할 수 있지만, 항상 위와 같이 간단하지는 않습니다.의 큰 '먹다' 입니다.scanf()
는 입력 스트림의 입력이 포맷과 일치하지 않는 경우 해당 입력을 폐기하지 않습니다.를 들어, '먹다'를요.abc
잠 an an int
를 들면, 다음과 같습니다.scanf("%d", &int_var);
abc
읽고 폐기해야 합니다.★★★★★★★★★★★★★★★★★★:
#include <stdio.h>
int main(void)
{
int i;
while(1) {
if (scanf("%d", &i) != 1) { /* Input "abc" */
printf("Invalid input. Try again\n");
} else {
break;
}
}
printf("Int read: %d\n", i);
return 0;
}
다른 는 섞이다scanf()
★★★★★★★★★★★★★★★★★」fgets()
★★★★★★★★★★★★★★★★★★:
#include <stdio.h>
int main(void)
{
int age;
char name[256];
printf("Input your age:");
scanf("%d", &age); /* Input 10 */
printf("Input your full name [firstname lastname]");
fgets(name, sizeof name, stdin); /* Doesn't read! */
return 0;
}
의 콜fgets()
이전 scanf() 호출이 남긴 새 회선이 읽혀지고 새 회선이 발견되면 fgets()가 입력 읽기를 종료하기 때문에 입력을 기다리지 않습니다.
에도 비슷한 있습니다.scanf()
그래서 피하는 것이 좋습니다.
그럼, 대안이 뭐죠?대신 다음 방법으로 함수를 사용하여 단일 문자를 읽습니다.
#include <stdio.h>
int main(void)
{
char line[256];
char ch;
if (fgets(line, sizeof line, stdin) == NULL) {
printf("Input error.\n");
exit(1);
}
ch = line[0];
printf("Character read: %c\n", ch);
return 0;
}
시 주의해야 할 1개fgets()
bufferinut에 줄 .바람직하지 않은 경우는, 다음의 순서로 삭제할 수 있습니다.
char line[256];
if (fgets(line, sizeof line, stdin) == NULL) {
printf("Input error.\n");
exit(1);
}
line[strcpsn(line, "\n")] = 0; /* removes the trailing newline, if present */
이거면 될 것 같아
int main(){
char c;
scanf(" %c",&c);
printf("%c",c);
return 0;
}
여기 제가 공유하고 싶은 비슷한 것이 있습니다.
Visual Studio에서 작업하는 동안 다음과 같은 오류가 발생할 수 있습니다.
'scanf': 함수 또는 변수가 안전하지 않을 수 있습니다.사용을 검토하다
scanf_s
대신.폐지 기능을 디세블로 하려면 , 를 사용합니다._CRT_SECURE_NO_WARNINGS
이를 방지하려면 다음 형식으로 작성해야 합니다.
단일 문자는 다음과 같이 읽을 수 있습니다.
char c;
scanf_s("%c", &c, 1);
Null이 아닌 종단 문자열의 여러 문자를 읽을 경우 정수가 너비 지정 및 버퍼 크기로 사용됩니다.
char c[4];
scanf_s("%4c", &c, _countof(c));
fgets도 getchar도 문제를 해결하는데 효과가 없습니다.유일한 회피책은 scanf scanf % %c",ch)를 사용하는 동안 %c 앞에 공간을 유지하는 것입니다. //만 작동합니다.
다음 fgets 또한 작동하지 않습니다.
char line[256];
char ch;
int i;
printf("Enter a num : ");
scanf("%d",&i);
printf("Enter a char : ");
if (fgets(line, sizeof line, stdin) == NULL) {
printf("Input error.\n");
exit(1);
}
ch = line[0];
printf("Character read: %c\n", ch);
대신 getchar()를 사용해 보겠습니다.
구문:
void main() {
char ch;
ch = getchar();
}
나한테 효과가 있었던 유일한 암호는
scanf(" %c",&c);
나도 같은 문제를 겪고 있었는데, 오직 한 명의 캐릭터만 있었다.1시간의 랜덤 테스트 후 아직 문제를 보고할 수 없습니다.C는 현재 키보드에서 단일 문자를 검색하는 방탄 기능을 가지고 있을 것으로 생각되며, 가능한 해킹 방법은 배열되어 있지 않습니다.그냥...
scanf put 전fflush(stdin);
버퍼를 클리어합니다.
유효한 변수를 사용해야 합니다. ch
는 이 프로그램에 유효한 변수가 아닙니다.사용하다char Aaa
;
char aaa;
scanf("%c",&Aaa);
테스트 완료 후 동작.
컴파일러가 공백을 무시하도록 %c 변환 지정자 앞에 공백을 제공합니다.프로그램은 다음과 같이 기술할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch;
printf("Enter one char");
scanf(" %c", &ch); /*Space is given before %c*/
printf("%c\n",ch);
return 0;
}
대신 문자열 사용char
맘에 들다
char c[10];
scanf ("%s", c);
잘 될 것 같아.
언급URL : https://stackoverflow.com/questions/13542055/how-to-do-scanf-for-single-char-in-c
'programing' 카테고리의 다른 글
VueJ는 부모로부터 자녀 컴포넌트의 데이터에 액세스합니다. (0) | 2022.08.21 |
---|---|
Vuex의 "router.currentRoute.name"이 변경되었을 때 계산된 속성 업데이트 (0) | 2022.08.21 |
'synchronized'는 무슨 뜻입니까? (0) | 2022.08.21 |
VueJ에서 개체 속성별로 개체 배열을 필터링하는 방법s (0) | 2022.08.21 |
JS App에서 onReady 약속을 만들려면 어떻게 해야 합니까? (0) | 2022.08.21 |