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;
}

ありがとう!

4

3 に答える 3

1

malloc ステートメントを使用して必要なバイトを割り当て、関数内でそれへのポインターを返すようにしてください。

文字列の最大サイズをパラメーターとして関数に渡すことができるため、割り当てるバイト数を知ることができます。または、別の方法を使用して、値 0 の最初の文字を見つけるなど、割り当てるサイズを見つけることができます (o C のヌル終了文字列の場合)。

次に、次のようにします。

emailNew = malloc(max_bytes);

次に、関数の外で「free」ステートメントを使用して、malloc で割り当てたメモリの割り当てを解除できます。

于 2013-06-30T19:02:15.467 に答える
1
  char *emailNew;

  /* ... */

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

emailNewポインターは初期化されていないため、emailNew[i] = current割り当てによって未定義の動作が呼び出されます。

また:

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

emailCleanはすでに でchar *あり、%sが必要なchar *ので、実際にこれを行いたい:

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

コンパイラ オプションですべての警告を有効にして、すべての警告を修正することを強くお勧めします。

于 2013-06-30T18:51:04.770 に答える
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;
}
于 2013-06-30T19:32:37.663 に答える