2013-06-30 6 views
0

저는 C에 매우 익숙하며, 포인터를 사용하여 디코드 함수에서 반환 된 배열을 할당하여 포인터를 사용할 수 있도록합니다. 프로그램 (예 : 인쇄). 코드가 컴파일되지만 CGI를 실행할 때 "오류 500"이 발생합니다.함수에서 반환 된 변수를 할당하는 방법

#include <stdio.h> 
#include <string.h> 
#include <stddef.h> 
#include <stdlib.h> 

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

printf("Content-type: text/html\n\n"); 

char *decode(char *url); 

char *qPtr; 
char *ePtr; 
char *emailClean; 

if(qPtr = getenv("QUERY_STRING")) { 
    char Buffer[256]; 
    char *Token; 
    char username[80], password[80], email[80]; 
    strncpy(Buffer, qPtr, 255); //copy Env variable "QUERY_STRING" into qPtr pointer 

    Token = strtok(Buffer, "&"); //get first query 
    sscanf(Token, "username=%s", username); //gets value of username field input 

    Token = strtok(NULL, "&"); //get second query 
    sscanf(Token, "password=%s", password); //gets value of password field input 

    Token = strtok(NULL, "&"); //get third query 
    sscanf(Token, "email=%s", email); //gets value of email field input 

    ePtr = email; 

//decode email 
    emailClean = decode(ePtr); 
printf("%s\n", *emailClean); 

} 
else { printf("<p>Error: did not get a QUERY_STRING variable."); } 
} 

char *decode(char *url) { 
    char *emailNew; 
    int i = 0; 
    int y = 0; 
    char current = url[i]; 

while(current != '%') { 
    emailNew[i] = current; 
    y++; 
    current = url[i++]; 
} 
    return emailNew; 
} 

감사!

+0

것은 당신의 서식을 수정 할 수 있음을; 버그를 발견하는 것이 더 쉬워집니다. – Ponkadoodle

답변

1

malloc 문을 사용하여 필요한 바이트를 할당하고 함수에서 해당 바이트를 포인터로 반환하십시오.

문자열의 maxsize를 매개 변수로 함수에 전달할 수 있으므로 할당 할 바이트 수를 알 수 있습니다. 또는 다른 메서드를 사용하여 할당 할 크기를 찾을 수 있습니다. 예를 들어 값이 0 인 첫 번째 문자를 찾습니다 (C null 종료 문자열 인 경우).

그런 다음 바로 수행

emailNew = malloc(max_bytes); 

그런 다음, 함수 외부 당신은 당신의 malloc으로 할당 된 메모리 할당을 해제하기 위해 "무료"문을 사용할 수 있습니다.

+0

스택 오버플로에 오신 것을 환영합니다.조만간 [자주 묻는 질문]을 읽고 문장의 시작 부분에 대문자를 사용하십시오. 나는 당신이'할당 된 배열 크기가 0 인 것을 'char current = url [i];에서 어떻게 추론하는지 잘 모르겠다. 간단한 변수 정의가 URL 문자열의 첫 번째 문자로 초기화 된 것을 볼 수 있습니다. –

+0

고마워요. 조나단, 크기가 0이 아닌 배치 된 어레이에 대해 옳습니다. 나는 그것을 교정 할 것입니다. 어쨌든 당신은 이미 완전한 답을 보았습니다. 환영합니다. –

1
char *emailNew; 

    /* ... */ 

    while(current != '%') { 
    emailNew[i] = current; 
    y++; 
    current = url[i++]; 
    } 

emailNew 포인터가 초기화되지 않습니다 때문에 emailNew[i] = current 할당은 정의되지 않은 동작을 호출합니다. 또한

:

printf("%s\n", *emailClean); 

emailClean 이미 char *하고 %schar * 그래서 당신이 실제로 이렇게 할 필요

printf("%s\n", emailClean); 

난 강력하게 당신의 컴파일러 옵션의 모든 경고를 사용하도록 제안하고 모든 경고를 고쳐라.

+0

특히 경고를 켭니다! –

+0

고마워, 나는 지금 일할 수있어! –

0

이미 진단 된 것처럼 함수 decode()은 공간을 올바르게 할당하지 않습니다.

그러나 다른 (이전에 진단되지 않은) 문제로도 실행됩니다. 전자 메일 주소에 %이 포함되어 있지 않으면 어딘가에서 찾을 때까지 관계없는 메모리를 읽습니다. 덜 심각하게 변수 y은 아무런 효과가 없습니다. 당신은 그것을 초기화하고 증가 시키지만 결코 그 값을 읽지는 않습니다.

나는 코드가 더 같이 작성해야한다고 생각 :

char *decode(char *url) 
{ 
    char *emailNew; 
    char *end = strchr(url, '%'); 
    if (end == 0) 
     end = url + strlen(url); 
    emailNew = malloc(end - url + 1); 
    if (emailNew != 0) 
    { 
     memmove(emailNew, url, end - url); // Or memcpy() 
     emailNew[end - url] = '\0'; 
    } 
    return emailNew; 
} 

이것은 문자열에서 문자 찾기 위해 표준 C 라이브러리 함수를 사용 - strchr()합니다. 백분율 기호를 찾지 못하면 전체 문자열을 사용하십시오. 충분한 공간을 할당하십시오. 성공했을 경우는, 할당 끝난 스페이스에 캐릭터 라인 (null로 끝나지 않았을 가능성이있다)을 카피 해, 캐릭터 라인을 null로 종료합니다. 그런 다음 데이터를 반환하십시오.

당신은 또한의 라인을 따라 함수에서 검색하고 다시 작성할 수 :

char *decode(char *url) 
{ 
    char *emailNew; 
    int i; 
    char current; 

    for (i = 0; (current = url[i]) != '%' && current != '\0'; i++) 
     ; 

    emailNew = malloc(i + 1); 
    if (emailNew != 0) 
    { 
     memmove(emailNew, url, i); 
     emailNew[i] = '\0'; 
    } 
    return emailNew; 
} 
관련 문제