2011-11-01 2 views
0

나는이 문제에 대한 해결책을 찾고 있었지만 아직 발견하지 못했습니다.배열 포인터 함수

좀 문자열 조작 (간체)를 수행하는 기능을 가지고

:

내 문제는 내가 기능에서 밖으로 내 결과를 얻을 수 없다는 사실에있다
void plr(char str, char *stro){ 
    strcpy(*stro, str); 
} 

:

int main(void){ 
    //string and string out. 
    char str[25], stro[25]; 
    printf("Something please: "); 
    scanf("%s", &str); 

    plr(str, &stro); // So basically stro would be the same as str. 
    printf("Copy succesfull, %s", stro); 
    return 0; 
} 

전체적인 아이디어는 다항 함수를 주어진 스트링에 복수형을 추가하여 스트로크로 출력하는 함수 다. 전체 문자열 조작은 main() 내부에 있으면 테스트되고 작동하지만 함수와 포인터로 작동하지는 않습니다. 나는 그것을 분명히 떠날 수 있었지만, 나는 그걸 어떻게 알게 될 것인가.

일반적인 정렬 값보다는 배열을 가리킬 때 고려해야 할 것이 있습니까?

편집 : 모든 도움을 주셔서 감사 드리며 해결되었습니다. 대단히 감사합니다! 당신을

void plr(char* str, char *stro) 

당신은 배열 str을 전달하려는 :

+2

STR 그래서 우선, 당신이 기능은'무효 PRL (CONST의 char * str을, 숯불 *의 STRO)'해야 PRL, 및 STR 소스이기 때문에,이 경우, 포인터이어야합니다 const를 패스한다. – Aif

답변

0

엉망 포인터와 그 방법에 대한 필요가 없습니다)

[email protected]:~$ cat prova.c 
#include <stdio.h> 
#include <string.h> 

void foo(char *strin, char *strout) 
{ 
    strcpy(strout, strin); 
} 

int main(void) 
{ 
    char a[100], b[100]; 

    printf("What's a? "); 
    scanf("%s", a); 

    printf("What's b? "); 
    scanf("%s", b); 

    foo(a, b); 

    printf("a is \"%s\"\nb is \"%s\"\n", a, b); 
} 
[email protected]:~$ gcc prova.c 
[email protected]:~$ ./a.out 
What's a? abc 
What's b? def 
a is "abc" 
b is "abc" 
[email protected]:~$ 

Explaination :
이 작동하기 때문에 당신은 배열의 이름을 사용하는 경우 은 첫 번째 요소에 대한 포인터에을 소멸시킵니다. 따라서 foo(a, b)은 실제로 foo(&a[0], &b[0])입니다. 따라서 ab이 배열 인 경우에도 함수에 전달하면 포인터로 변환됩니다.
here에서 인용 : 배열이 포인터로 붕괴하기 때문에

당신이 함수에 인수로 배열을 전달

, 당신은 정말, 배열의 첫 번째 요소에 대한 포인터 를 전달합니다.

및 아래 몇줄 :

썩이 암시 &이고; array == & array == & array [0]. 영어의 경우 이 표현식은 "배열", "배열 포인터"및 " 배열의 첫 번째 요소에 대한 포인터"를 읽습니다 (아래 첨자 연산자 [])는 주소 연산자보다 우선 순위가 높음). 그러나 C에서 세 개의 표현은 모두 같은 것을 의미합니다.

결론적으로 코드의 문제는 plr의 프로토 타입입니다.

이 현상에 대한 자세한 정보는에 대한 포인터 붕괴 배열 을 찾으십시오. :)

+0

그러나 위대한 작품이지만, 왜 갑자기 왜 앞에서 & 기호가 필요하지 않은지 이해할 수 없다. 출력, 당신이 평소처럼 (적어도 내가 배운 것). 당신이 정교 할 수 있다면 크게 감사하겠습니다. – Dennis

+0

@ 콜라 : 그는 포인터를 수정하지 않으므로'&'는 필요하지 않으며 단지 포인터의 복사본을 취합니다. 대신 포인터가 가리키는 부분을 수정하고 있습니다. –

+0

답안을 읽을 수 있도록 편집 한 다음 사람들에게 읽도록 요청하십시오. – littleadv

0

은 아마 당신은 즉, 함수 난 당신이에 코드를 변경할 필요가 있다고 생각 void plr(char str, char **stro)

0

를 선언 포인터에 대한 포인터를 필요 char * str 포인터를 사용해야한다.

배열을 함수에 직접 전달할 수 있다고 생각하지 않습니다.

char str [25]을 선언하는 경우; 컴파일러는 배열에 대한 메모리를 예약합니다. char *를 사용하면 배열의 첫 번째 요소를 가리키게됩니다.

이 작품이 좋겠어!

할머니,

디터

+0

배열을 함수에 "직접"전달할 수는 있지만 어쨌든 참조로 전달합니다. –

+0

나는 명확히 말하지 않았다, 미안. 한 번 void plr (char str [], char stro []) 같은 것을 사용하려고했습니다. 그것은 작동하지 않았다 ^^ 그것은 내가 '그들을 직접 지나쳐'라고 말하려고했던 것이었다. :) –

2

이 일을해야한다 :

void plr(char str[], char stro[]) 
{ 
    strcpy(stro, str); 
} 

int main(void) 
{ 
    char str[25], stro[25]; 
    printf("Something please: "); 
    scanf("%s", &str); //unsafe code 

    plr(str, stro); 
    printf("Copy succesfull, %s", stro); 
    return 0; 
} 

배열에 대한 포인터 또는 이상 문자열을 사용할 때 매우주의하시기 바랍니다 : 사용

  1. http://pw1.netcom.com/~tjensen/ptr/pointers.htm

을 사용자로부터 문자열을 얻으려면 scanf가 더 많은 일을하는 것이 좋습니다.

  1. Disadvantages of scanf