에 배열로 입력 문자열을 가져 오기, 우리는 그런 짓을. 어쨌든 나는 [1] ... 등등 ...는 C에서 C
는 C에서 C
답변
네,하지만 당신이 할 필요가 입력 [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
사용 : 반드시 그렇게 할 충분한 공간이 입력에 할당 된 공간이 없으므로이를 수행 할 수 없습니다.
입력으로 입력 된 세 단어가 공백으로 구분되어 있다고 가정 해 봅시다. 이 세 단어를 배열에 저장하고 싶습니다. 어떤 단어라도 될 수 있습니다 ..main()에 전달 된 인수에 액세스하는 것처럼이 단어에 액세스하려고합니다. 위의 예를 들어 본다면 입력 된 내용이 모두 입력되어 있습니다. [0] – suenda
처음에는 줄 수를 알지 못하는 경우가 있지만 다소 지루할 수 있습니다.
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의 거듭 제곱과 같은 값으로 반올림됩니다. 이 효과는 관련된 선 길이에 따라 다릅니다. 길어서 긴 줄이 있다면 아마별로 중요하지 않을 것입니다. 짧은 줄이 많으면 로을 절약 할 수 있습니다.
답장을 보내 주셔서 감사합니다. 나는 실제로 프로그램, 스크립트를 실행하고 변수를 관리 할 수있는 bash와 같은 것을 개발하려고하고있다. 사용자는 인수 다음에 명령을 입력합니다. 배열을 통해 입력 한 모든 문자열에 액세스하려고합니다. 위의 예제에서, 나는 당신이 문자열이 텍스트 파일보다 훨씬 더 크다고 가정합니다. 제 경우처럼 버퍼에서 문자열을 먼저 읽은 다음 분리 기호로 공백을 사용해야합니다. 문자열을 분리하고 동적으로 정의하여 배열에 저장하십시오. 다른 대안이있을 수 있을까요 ?? – suenda
'currentline
@suenda : 네, scanf와 fgets에 대한 언급을 파일에서 입력을 읽을 계획이라고 해석했습니다. 커맨드 라인 인자에 관심이 있다면,'argv [1]'...'argv [argc-1]'을 통해 읽을 수 있습니다. –
- 1. 는 [C++하지] C에서 C
- 2. 는 C에서
- 3. C에서 "var"는 C에서 "size_t"와 유사합니까?
- 4. extern "C"는 C에서 어떤 효과가 있습니까?
- 5. 는 C에서 반환 식 ++
- 6. 는 C에서 파일 ++
- 7. 는 C에서 파이프를 생성
- 8. 는 C
- 9. 는 C에서 오답 ++
- 10. Objective-C에서 @는 무엇을 의미합니까?
- 11. 는 C/C++
- 12. 는 목표 - C에서 문자열을 비교
- 13. 는 C
- 14. C : '는 무엇을합니까?
- 15. feof()는 C에서 어떻게 작동합니까?
- 16. 객관적인 C에서 ^는 무엇을 의미합니까?
- 17. C에서 rand()는 얼마나 고유합니까?
- 18. 는 C
- 19. 는 pthread_create 오류 C에서 ++ (클래스 내부의 pthread)
- 20. 는 C 게임이나 프로그램은
- 21. Objective-C에서 기호 ^는 무엇을 의미합니까?
- 22. Objective-C에서 "& error"는 무엇을 의미합니까?
- 23. "Context"는 Cocoa/Objective-c에서 무엇을 의미합니까?
- 24. #include iostream in C? C에서
- 25. 는 C#을
- 26. 는
- 27. C에서 C++ 라이브러리 호출 #
- 28. C에서 C++ 객체 사용
- 29. C/C에서 DLL과 연결 #
- 30. C++, 화합물 C에서
이틀 후에이 사실을 묻고 싶습니다. : P 마지막으로, 다른 사람이했습니다. 감사합니다 –