[c] 콘솔에서 C로 줄을 읽는 방법은 무엇입니까?

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