2011-11-07 2 views
2

에 배열로 입력 문자열을 가져 오기, 우리는 그런 짓을. 어쨌든 나는 [1] ... 등등 ...는 C에서 C

+0

이틀 후에이 사실을 묻고 싶습니다. : P 마지막으로, 다른 사람이했습니다. 감사합니다 –

답변

3

네,하지만 당신이 할 필요가 입력 [0], 입력으로 입력 한 문자열에 액세스 할 수 있습니다

char **input; 
scanf("%s", &input); 

:

내가 좋아하는 시도

char input[3][50]; // enough space for 3 strings with 
        // a length of 50 (including \0) 

fgets(&input[0], 50, stdin); 
printf("Inputted string: %s\n", input[0]); 

char **input 사용 : 반드시 그렇게 할 충분한 공간이 입력에 할당 된 공간이 없으므로이를 수행 할 수 없습니다.

+0

입력으로 입력 된 세 단어가 공백으로 구분되어 있다고 가정 해 봅시다. 이 세 단어를 배열에 저장하고 싶습니다. 어떤 단어라도 될 수 있습니다 ..main()에 전달 된 인수에 액세스하는 것처럼이 단어에 액세스하려고합니다. 위의 예를 들어 본다면 입력 된 내용이 모두 입력되어 있습니다. [0] – suenda

3

처음에는 줄 수를 알지 못하는 경우가 있지만 다소 지루할 수 있습니다.

char **input; 

그만큼 좋습니다. 거기에서 포인터의 배열을 할당해야합니다 :

input = malloc(sizeof(char *) * MAX_LINES); 

그런 다음 각 줄에 공백을 할당해야합니다. 당신은 일반적으로 각 문자열에 대한 충분한 공간을 원하기 때문에, 일반적으로 같은 것을 할 :

#define MAX_LINE_LEN 8192 

static char buffer[MAX_LINE_LEN]; 
long current_line = 0; 

while (fgets(buffer, sizeof(buffer), infile) && current_line < MAX_LINES) { 
    input[current_line] = malloc(strlen(buffer)+1); 
    strcpy(buffer[current_line++], buffer); 
} 

이 선행 행의 수를 알 수없는 경우, 당신은 일반적으로 포인터의 숫자로 시작하는 할당 (위에서와 같이), 각 행을 읽으면서 현재 할당을 초과했는지 확인하고 포인터의 배열을 다시 할당하여 공간을 확보하십시오.

만약 당신이 충분히 나쁘다면 각 줄마다 똑같이 할 수 있습니다. 위의 경우 단순히 최대 값을 설정 했으므로 가장 일반적인 텍스트 파일의 경우 최대 값을 초과하지 않을 것입니다. 더 크게 필요하면 확장하기가 쉽습니다. 동시에 선택하는 숫자는 임의의 한도가됩니다. 원하는 경우 청크를 버퍼로 읽을 수 있으며 문자열의 마지막 문자가 개행 문자가 아닌 경우 동일한 문자열로 계속 읽습니다 (realloc을 사용하여 필요에 따라 할당을 확장 할 수도 있음) . 이것은하기가 대단히 어렵지는 않지만 모든 코너 케이스를 올바르게 커버하는 것은 지루할 수 있습니다.

편집 : 동일한 기본 효과를 얻으려면 다소 다른 방법이 있다고 덧붙여 야합니다. 파일의 전체 내용을 하나의 큰 버퍼로 읽어 들인 다음 strtok을 사용하여 버퍼를 줄 바꿈 ("\ n"을 "\ 0"으로 대체)하여 버퍼에 대한 포인터 배열을 작성합니다. 이것은 일반적으로 속도를 다소 향상시킵니다 (많은 한 행 읽기 대신 큰 읽기 하나)뿐만 아니라 많은 작은 것들 대신 큰 할당 하나를 사용하기 때문에 할당 오버 헤드가 있습니다. 각 할당은 일반적으로 헤더를 가지며 2의 거듭 제곱과 같은 값으로 반올림됩니다. 이 효과는 관련된 선 길이에 따라 다릅니다. 길어서 긴 줄이 있다면 아마별로 중요하지 않을 것입니다. 짧은 줄이 많으면 을 절약 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 실제로 프로그램, 스크립트를 실행하고 변수를 관리 할 수있는 bash와 같은 것을 개발하려고하고있다. 사용자는 인수 다음에 명령을 입력합니다. 배열을 통해 입력 한 모든 문자열에 액세스하려고합니다. 위의 예제에서, 나는 당신이 문자열이 텍스트 파일보다 훨씬 더 크다고 가정합니다. 제 경우처럼 버퍼에서 문자열을 먼저 읽은 다음 분리 기호로 공백을 사용해야합니다. 문자열을 분리하고 동적으로 정의하여 배열에 저장하십시오. 다른 대안이있을 수 있을까요 ?? – suenda

+0

'currentline Dmitri

+0

@suenda : 네, scanf와 fgets에 대한 언급을 파일에서 입력을 읽을 계획이라고 해석했습니다. 커맨드 라인 인자에 관심이 있다면,'argv [1]'...'argv [argc-1]'을 통해 읽을 수 있습니다. –