C에서 char 배열의 역순
포인터는 나를 많이 혼란스럽게합니다. 인수 argc (문자열 인수 수 + 코드 이름 1)와 char * argv [] (잘 이해했다면 포인터 배열)를 취하는 함수가 있습니다. 이제 결과적으로 각 줄에 인수 (문자열)와 반전 된 문자열을 인쇄해야합니다. 즉, hello world 인수로 전달하면 다음이 필요합니다.
hello olleh
world dlrow
코드의 일부를 구현하려고했습니다.
int main(int argc, char *argv[])
{
int i = 1;
int j;
while (i < argc)
{
while (argv[i][j] != 0) {
printf("%c", argv[i][j]);
j++;
}
i++;
}
return 0;
}
}
그리고 이제 나는 말 그대로 길을 잃었습니다. 내부 루프가 작동하지 않습니다. argv [i]가 모든 인수 문자열을 통과한다는 것을 알고 있지만 포인터를 교체하려면 문자열 (문자 배열)을 입력해야합니다. 또한 왜 argv [0]과 * argv의 차이점을 이해하지 못합니다. 이론적으로 argv [0]은 포인터 인 배열의 첫 번째 요소를 인쇄하므로 주소이지만이 대신 첫 번째 인수를 인쇄합니다. .
답변
char* argv[]"문자에 대한 포인터 배열"입니다. C에서 유형을 읽는 방법을 배우는 것이 중요합니다. 왜냐하면 이러한 유형은 작업을 수행하는 능력을 가능하게하거나 방해 할 수 있기 때문입니다.
유형은 오른쪽에서 왼쪽으로 읽습니다. []지정되지 않은 수의 elemnt *가 포인터 유형 인 배열 유형이며 char기본 유형입니다. 이들을 결합하면 이제 "문자에 대한 포인터 배열"이 생깁니다.
따라서에서 무언가를 얻으 argv려면 먼저 배열에있는 요소를 지정해야합니다. argv[0]첫 번째 요소를 지정합니다. 반환되는 내용을 살펴 보겠습니다. 배열이 결과의 일부가 아니기 때문에 대답은 "문자에 대한 포인터"입니다.
char* line = argv[0];
argv [0]에 저장된 문자에 대한 포인터를 캡처합니다.
C에서 char*또는 "문자에 대한 포인터"는 문자열에 사용되는 규칙입니다. C에는 "문자열"에 대한 새로운 유형이 없습니다. 오히려 문자에 대한 포인터를 사용합니다. 여기서 포인터를 전진 시키면 결국 \0문자열의 끝을 알리는 문자 로 실행됩니다 .
int main(int argc, char* argv[]) {
int index = 0;
while (index <= argc) {
char* line = argv[index];
printf("%d, %s\n", index, line);
index++;
}
}
프로그램에 전달 된 주장을 덤프해야합니다. 거기에서 나머지는 처리 할 수 있다고 생각합니다.
포인터를 배열로 변환 한 적이 없습니다. 배열의 인덱스를 지정하지 않으면 배열을 포인터로 사용할 수 있지만 일반적으로 형식 시스템에없는 정보에 의존하지 않는 한 일반적으로 포인터를 배열로 사용할 수 없습니다 (예 : 배열에서 포인터를 명확하게 잡은 경우). 다른 곳).
행운을 빕니다!
---- "어떻게 되돌릴 수 있습니까?"라는 질문을 해결하도록 업데이트되었습니다. ----
이제 간단한 char*(문자에 대한 포인터) 문자열을 어떻게 뒤집을 수 있습니까?
문자열은 문자에 대한 포인터이며 다음 문자는 결국 문자로 끝납니다 \0. 먼저 문자열의 끝을 찾아야합니다.
char* some_string = ...
char* position = some_string;
while (*position != 0) {
position++;
}
// end_of_string set, now to walk backwards
while (position != some_string) {
position--;
printf("%c", *end_of_string);
}