공백 문자가 있는 입력에서 문자열을 읽으시겠습니까?
Ubuntu를 사용하고 있으며 Geany와 CodeBlock도 IDE로 사용하고 있습니다.제가 하려고 하는 것은 줄을 읽는 것입니다."Barack Obama"
)를 사용하여 변수를 지정합니다.
#include <stdio.h>
int main(void)
{
char name[100];
printf("Enter your name: ");
scanf("%s", name);
printf("Your Name is: %s", name);
return 0;
}
출력:
Enter your name: Barack Obama
Your Name is: Barack
어떻게 하면 프로그램이 전체 이름을 읽게 할 수 있나요?
용도:
fgets (name, 100, stdin);
100
버퍼의 최대 길이입니다.당신은 필요에 따라 그것을 조정해야 합니다.
용도:
scanf ("%[^\n]%*c", name);
그[]
는 스캔셋 문자입니다. [^\n]
는 입력이 뉴라인이 아님을 나타냅니다('\n'
)를 입력해 주세요.그 후,%*c
입력 버퍼에서 줄바꿈 문자를 읽고(읽지 않음),*
는, 이 읽기 입력이 불필요하게 파기(삭제)되는 것을 나타내고 있습니다.또, 버퍼내의 이 새로운 행은, 다음의 입력에 관한 문제를 일으키지 않습니다.
스캔 세트 및 할당 억제 연산자에 대한 내용은 여기를 참조하십시오.
주의:gets
근데...
사용 안 함
gets()
몇 글자가 읽힐지 미리 알지 못하면 알 수 없기 때문입니다.gets()
는 버퍼의 끝을 지나도 문자를 계속 저장합니다.사용하는 것은 매우 위험합니다.컴퓨터 보안을 깨기 위해 사용되었습니다.사용하다fgets()
대신.
이것을 시험해 보세요.
scanf("%[^\n]s",name);
\n
는 스캔한 문자열의 딜리미터를 설정합니다.
정답은 다음과 같습니다.
#include <stdio.h>
int main(void)
{
char name[100];
printf("Enter your name: ");
// pay attention to the space in front of the %
//that do all the trick
scanf(" %[^\n]s", name);
printf("Your Name is: %s", name);
return 0;
}
% 앞에 있는 공간은 매우 중요합니다. 프로그램에 다른 몇 개의 스캔f가 있다고 가정하면 정수 값의 스캔f가 1개 있고 이중 값의 스캔f가 있다고 가정하면...char(문자명)에 대한 scanf에 도달하면 해당 명령어는 건너뛰어 값을 입력할 수 없습니다.그러나 % 앞에 그 공간을 두면 모든 것이 문제없이 진행됩니다.
scanf(" %[^\t\n]s",&str);
str
는 문자열을 가져오는 변수입니다.
다음 예제에서는 를 사용하여 공백이 포함된 입력을 얻는 방법을 보여 줍니다.fgets
기능.
#include <stdio.h>
int main()
{
char name[100];
printf("Enter your name: ");
fgets(name, 100, stdin);
printf("Your Name is: %s", name);
return 0;
}
#include <stdio.h>
// read a line into str, return length
int read_line(char str[]) {
int c, i=0;
c = getchar();
while (c != '\n' && c != EOF) {
str[i] = c;
c = getchar();
i++;
}
str[i] = '\0';
return i;
}
메모: fgets()를 사용하는 경우 CLI(명령줄 인터프리터)에서 작은 입력에 fgets()를 사용할 때 배열의 마지막 문자는 "\n"이 됩니다.이 경우 문자열은 "Enter"로 끝납니다.따라서 문자열을 인쇄할 때 컴파일러는 문자열을 인쇄할 때 항상 다음 행으로 이동합니다.입력 문자열에 동작과 같은 null 종단 문자열을 지정하려면 이 간단한 해크를 사용합니다.
#include<stdio.h>
int main()
{
int i,size;
char a[100];
fgets(a,100,stdin);;
size = strlen(a);
a[size-1]='\0';
return 0;
}
업데이트: 다른 사용자의 도움을 받아 업데이트되었습니다.
"%s"
는 공백에 도달할 때까지 입력을 읽습니다.
행을 읽으려면 를 시작하는 것이 좋습니다(즉, 새 행에 도달할 때까지 공백을 포함한 모든 문자).
여러 행을 읽어야 할 경우 버퍼를 클리어해야 합니다.예:
int n;
scanf("%d", &n);
char str[1001];
char temp;
scanf("%c",&temp); // temp statement to clear buffer
scanf("%[^\n]",str);
이 코드를 사용하면 키보드의 Enter 키를 누를 때까지 입력을 받을 수 있습니다.
char ch[100];
int i;
for (i = 0; ch[i] != '\n'; i++)
{
scanf("%c ", &ch[i]);
}
"Barack Obama"는 "Barack"과 "Obama" 사이에 공백이 있다.이를 수용하려면 이 코드를 사용하십시오.
#include <stdio.h>
int main()
{
printf("Enter your name\n");
char a[80];
gets(a);
printf("Your name is %s\n", a);
return 0;
}
scanf("%s",name);
사용하다&
와 함께scanf
입력
상기의 방법은 유효하지만, 각각의 방법이 나름의 문제를 안고 있습니다.
사용할 수 있습니다.getline()
또는getdelim()
Posix 지원 플랫폼을 사용하는 경우.Windows 와 minigw 를 컴파일러로서 사용하고 있는 경우는, 사용할 수 있습니다.
getline()
는 다음과 같이 정의됩니다.
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
입력을 받으려면 먼저 char type에 대한 포인터를 만들어야 합니다.
#include <stdio.h>
#include<stdlib.h>
// s is a pointer to char type.
char *s;
// size is of size_t type, this number varies based on your guess of
// how long the input is, even if the number is small, it isn't going
// to be a problem
size_t size = 10;
int main(){
// allocate s with the necessary memory needed, +1 is added
// as its input also contains, /n character at the end.
s = (char *)malloc(size+1);
getline(&s,&size,stdin);
printf("%s",s);
return 0;
}
입력 예:Hello world to the world!
출력:Hello world to the world!\n
여기서 주의할 점은 에 할당된 메모리는 11바이트이지만 입력 사이즈는 26바이트이므로 getline은 재할당합니다.s
사용.realloc()
.
따라서 입력 시간이 얼마인지는 중요하지 않습니다.
size
위의 샘플 입력에 따라 읽은 바이트 수로 갱신됩니다.size
될 것이다27
.
getline()
또한 고려하다\n
입력으로.따라서 's'는 마지막에 '\n'이 됩니다.
의 일반 버전도 있습니다.getline()
,어느 것이getdelim()
즉, 1개의 추가 인수가 필요합니다.delimiter
.
getdelim()
는 다음과 같이 정의됩니다.
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
언급URL : https://stackoverflow.com/questions/6282198/reading-string-from-input-with-space-character
'source' 카테고리의 다른 글
Nuxt.js nuxtServerInit 및 Vuex를 사용하여 데이터 서버를 로드하는 중 (0) | 2022.08.30 |
---|---|
컴포넌트 VUE 2(웹팩)에 외부 js 파일을 로드하는 방법 (0) | 2022.08.30 |
Java에서 String을 long으로 변환하는 방법 (0) | 2022.08.30 |
입력 필드를 바인딩하고 vuex 상태를 동시에 업데이트하는 방법 (0) | 2022.08.30 |
서비스 워커 이벤트가 호출되고 있음을 App.vue에 알리다 (0) | 2022.08.30 |