C 콘솔 프로그램에서 전체 줄을 읽는 가장 간단한 방법은 무엇입니까 입력 된 텍스트는 가변 길이를 가질 수 있으며 내용에 대해 어떤 가정도 할 수 없습니다.
답변
동적 메모리 관리가 필요하고 fgets
기능을 사용 하여 라인을 읽습니다. 그러나 얼마나 많은 문자를 읽었는지 확인할 방법이없는 것 같습니다. 따라서 fgetc를 사용합니다.
char * getline(void) {
char * line = malloc(100), * linep = line;
size_t lenmax = 100, len = lenmax;
int c;
if(line == NULL)
return NULL;
for(;;) {
c = fgetc(stdin);
if(c == EOF)
break;
if(--len == 0) {
len = lenmax;
char * linen = realloc(linep, lenmax *= 2);
if(linen == NULL) {
free(linep);
return NULL;
}
line = linen + (line - linep);
linep = linen;
}
if((*line++ = c) == '\n')
break;
}
*line = '\0';
return linep;
}
참고 : get을 사용하지 마십시오! 경계 검사를 수행하지 않으며 버퍼를 오버플로 할 수 있습니다.
답변
GNU C 라이브러리 또는 다른 POSIX 호환 라이브러리를 사용 하는 경우 파일 스트림에 대해 사용 getline()
하고 전달할 수 있습니다 stdin
.
답변
정적 할당을 위해 줄을 읽는 매우 간단하지만 안전하지 않은 구현 :
char line[1024];
scanf("%[^\n]", line);
버퍼 오버플로의 가능성은 없지만 전체 행을 읽지 않을 가능성이있는 더 안전한 구현은 다음과 같습니다.
char line[1024];
scanf("%1023[^\n]", line);
변수를 선언하는 지정된 길이와 형식 문자열에 지정된 길이 사이의 ‘1만큼 차이’가 아닙니다. 역사적인 유물입니다.
답변
따라서 명령 인수를 찾고 있다면 Tim의 대답을 살펴보십시오. 콘솔에서 한 줄을 읽고 싶다면 :
#include <stdio.h>
int main()
{
char string [256];
printf ("Insert your full address: ");
gets (string);
printf ("Your address is: %s\n",string);
return 0;
}
예, 안전하지 않습니다. 버퍼 오버런을 수행 할 수 있으며 파일 끝을 확인하지 않으며 인코딩 및 기타 많은 항목을 지원하지 않습니다. 사실 나는 그것이 이런 일을하는지 생각조차하지 않았다. 나는 내가 약간 망친 것에 동의한다 :)하지만 … “어떻게 C로 콘솔에서 한 줄을 읽는가?”와 같은 질문을 볼 때, 나는 사람이 100 줄의 코드가 아닌 gets ()와 같은 간단한 것을 필요로한다고 가정한다. 위와 같이. 실제로 100 줄의 코드를 실제로 작성하려고하면 실수를 더 많이하게 될 것이라고 생각합니다.
답변
버퍼 오버플로가없고 입력을 자르지 않도록 문자 별 (getc ()) 루프를 사용해야 할 수도 있습니다.
답변
getline
실행 가능한 예
이 답변에 대해 언급 했지만 여기에 예가 있습니다.
그것은 POSIX 7 이고, 우리를 위해 메모리를 할당하고, 할당 된 버퍼를 루프에서 멋지게 재사용합니다.
포인터 newbs, 이것을 읽으십시오 : 왜 getline의 첫 번째 인수가 “char *”대신 “char **”포인터에 대한 포인터입니까?
#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *line = NULL;
size_t len = 0;
ssize_t read = 0;
while (read != -1) {
puts("enter a line");
read = getline(&line, &len, stdin);
printf("line = %s", line);
printf("line length = %zu\n", read);
puts("");
}
free(line);
return 0;
}
glibc 구현
POSIX가 없습니까? 아마도 glibc 2.23 구현 을보고 싶을 것 입니다.
이는 임의의 줄 종결자가 getdelim
있는 단순 POSIX 상위 집합 인 getline
으로 확인됩니다.
증가가 필요할 때마다 할당 된 메모리를 두 배로 늘리고 스레드로부터 안전 해 보입니다.
매크로 확장이 필요하지만 훨씬 더 잘할 수는 없습니다.
답변
저와 같은 많은 사람들이 검색된 제목과 일치하는 제목으로이 게시물을 찾습니다. 설명은 가변 길이에 대해 말하고 있습니다. 대부분의 경우 길이를 미리 알고 있습니다.
미리 길이를 알고 있다면 아래에서 시도해보십시오.
char str1[1001] = { 0 };
fgets(str1, 1001, stdin); // 1000 chars may be read
출처 : https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm