2014-12-04 2 views
0

포인터를 사용하여 문자열을 뒤집고 싶습니다. 세분화 오류가 발생했습니다. 그것에 관한 어떤 생각? 세부 사항은 코드에 나와 있습니다. 그건 그렇고,이게이 물건을 구현하는 올바른 방법일까요?배열과 포인터를 사용하여 문자열을 뒤집기

고맙습니다.

게르하르트!

내 CODE : 당신이 포인터를 얻고있는이

for (c = 0; c < len; c += 1) { 
    last += 1; 
} 

으로 문제가 해결되지 것

void copy_and_reverse(char* output, char* input) { 

int c = 0; 
int len = 0; 
char *begin; 
char *last; 

len = strlen(input); 
len -= 1; 

begin = input; 
last = output; 

for (c = 0; c < len; c += 1) { 
    last += 1; 
} 

len += 1; 

for (c = 0; c < len; c +=1, begin += 1, last -= 1 { 
temp = *begin; 
*last = *begin; // Here is my problem. Why am I not allowed to access this storage? I have no Idea about that! 
} 
} 

int main(int argc, char **argv) { 

int i = 0; 
int leng = 0; 
char *input[999] = {0}; // input gets the string of the argument, the string should stay in the right order 
char *output[999] = {0}; // output should get the reversed string 



if (argc == 1) { 
    printf("Too few arguments."); 
    return -1; 
} 

for (i = 0; i < argc; i += 1, argv += 1) { 
    if (strlen(*argv) > 100) { 
     printf("Maximum string length exceeded."); 
     return -2; 
    } 
} 
argv -= i; //Unnecessary stuff 
*argv += 1; 
argv += 1; 
argc -= 1; 


for (i = 0; i < argc; i += 1, argv += 1) { 
    *input = *argv; 
    copy_and_reverse(*output, *input); 
} 

return 0; 
} 

답변

0

당신은 선언하는 되세요 즉

copy_and_reverse(*output, *input); 

char *input[999] = {0}; 
char *output[999] = {0}; 

을, 당신은 정의 999 포인트의 배열 ers는 char 아이템으로, 999 char 아이템의 문자열은 아닙니다.

그리고 문제는 output []의 첫 번째 요소를 0으로 초기화하므로 * output == 0, 즉 copy_and_reverse()에 NULL 포인터를 전달하는 것입니다. 참조하려고 할 때 세그멘테이션 오류가 발생합니다.

char input[999] = {0}; 
char output[999] = {0}; 

copy_and_reverse(output, input); 

당신은 확인을해야 :

은 당신이 정말 필요한 것 같습니다.

@Mike S. 묵시록과 같은 붙여 넣은 코드에는 다른 문제가 있지만이 복사 - 붙여 넣기 솜씨가 있다고 생각합니다.

+0

이 문자 입력을 좋아한다면 [999] = {0}; char 출력 [999] = {0}; .. 어떻게 배열 (문자열) 인수를 줄 수 있습니까? 이것을 할 기회가 없습니다 : * input = * argv; , 더 이상, 그렇지 않습니까? – MrShow

+0

아, 네가 할 수 있습니다. char input [999]; * input *은 실제로는 (char *)이므로 포인터처럼 취급 할 수 있습니다. [] 연산자를 사용할 때 입력 [3]이라고하면 * (입력 + 3)을 수행하는 것과 동일합니다. 또한, 포인트를 고려해야합니까 @ 마이크 S. 제기! – kostas

0

찾을 수 몇 가지 문제, ...

1) "마지막으로"세트 문자열 끝. Btw,이주기에 쓸모가 없다 - 더 간단합니다 last = output + len;

2) 당신은 "임시 변수를 선언하지 않았습니다. 이 코드를 어떻게 컴파일 할 수 있습니까? 그리고 임시 변수는 사용되지 않습니다.

3) 은 주요 문제 중 하나 일 수 있습니다! - 문자열에 대한 포인터 배열로 입력했습니다. 문자 배열 (문자열이라고도 함)을 사용하고 싶을 수 있습니다. char * array[999]하지만

3) 왜 if (strlen(*argv) > 100)과 길이가 999 인 배열이 있습니까?

4) *input = *argv;은 유효하지 않습니다. char 어레이의 oyur 정의를 수리 한 후에는 input = * argv 여야합니다. 그리고 물론, 당신은 이것을 할 필요가 없습니다. 그냥 function(*argv)으로 부르십시오. 더 나은 function[argv[1]] 또는 무엇이 될 것입니다.

5) C 언어의 기초로 잠시 시간을내어 포인터, 배열 및 const 키워드로 작업하는 것을 잊지 마십시오.

void copy_and_reverse(char* output, char* input); 

하지만 호출 :

이 좋은 하루가

관련 문제