2010-11-01 223 views
0

探索互联网之后,我写了下面的脚本,但是仍然有错误,谁知道什么错误?(与// ERR行)C中传递一个字符串函数,那么返回一个字符串

typedef struct name_value_set { 
    char name[250]; 
    char value[250]; 
} nv_set; 

char * getInput2(char *param) { 
    char *my_data=0; 
    int data_len; 
    char *tmp_ptr, *tmp; 
    int i; 
    nv_set *nv; 

    data_len=atoi(getenv("CONTENT_LENGTH")); 
    char field[data_len]; 

    my_data=(char*)malloc(sizeof(char)*(data_len+1)); 
    fread(my_data,1,data_len,stdin); 

    i=0; 
    while (my_data[0]!='\0') { 
    tmp=split(my_data,'='); // err 
    makespace(tmp); 
    tmp=convert(tmp); // err 
    strcpy(nv[i].name,tmp); // 
    tmp=split(my_data,'&'); //err 
    makespace(tmp); // 
    tmp=convert(tmp); // err 
    strcpy(nv[i].value,tmp); // 
    i++; 
    } 
    i--; // 

    int j=0; 
    for (j=0; j<i; j++) { 
    if(nv[j].name == param) { 
     return nv[j].value; 
    } 


} 


void makespace(char *s) 
{ 
    int i,len; 
    len=strlen(s); 

    for (i=0;i<len;i++) { 
     if (s[i]=='+') 
     s[i]=' '; 
    } 
} 

char *split(char *s, char stop) 
{ 
    char *data; 
    char *tmp; 
    int i,len,j; 

    len=strlen(s); 
    tmp=s; 
    data=(char*)malloc(sizeof(char)*(len+1)); 

    for (i=0;i<len;i++) { 
     if (s[i]!=stop) 
     data[i]=s[i]; // 
     else { 
     i+=1; // 
      break; 
     } 
    } 
    data[i]='\0'; 
    for (j=i;j<len;j++) 
     s[j-i]=tmp[j]; 
     s[len-i]='\0'; 
    return data; 
} 


char *convert(char *s) 
{ 
    int x,y,len; 
    char *data; 

    len=strlen(s); 
    data=(char*)malloc(sizeof(char)*(len+1)); 
    y=0; 
    for (x=0;x<len;x++) { 
    if (s[x]!='%') { 
     data[y]=s[x]; // 
      y++; 
     } 
    else { 

     data[y]=(char)(16*hexa(s[x+1])+hexa(s[x+2])); 
     y++; 
     x=x+2; 
     } 
    } 
    data[y]='\0'; 
    return data; 
} 


int hexa(char c) 
{ 
    switch(c) { 
    case '0':return 0; 
    case '1':return 1; 
    case '2':return 2; 
    case '3':return 3; 
    case '4':return 4; 
    case '5':return 5; 
    case '6':return 6; 
    case '7':return 7; 
    case '8':return 8; 
    case '9':return 9; 
    case 'A':return 10; 
    case 'B':return 11; 
    case 'C':return 12; 
    case 'D':return 13; 
    case 'E':return 14; 
    case 'F':return 15; 
    } 
    return 0; 
} 
+1

不要模糊,成为一个王牌;写一个适当的测试用例! http://tinyurl.com/so-hints http://sscce.org/ http://www.xs4all.nl/~weegen/eelis/iso-c++/testcase.xhtml – 2010-11-01 05:52:06

+0

你不说什么错误是,但你可能只需要转发宣布你的功能。编译器按顺序解析你的文件,当它编译你的第一个函数时,它还没有“看到”split()。所以把'extern char * split(char *,char);'放在顶部,看看是否有帮助。 (当然重复其他功能) – 2010-11-01 05:52:06

+1

“仍然有错误”那么,什么样的错误?他们是编译错误吗?它是否编译?如果是这样,你可以运行它吗?它会崩溃吗?它不正确吗?你有没有试过附加一个调试器来查看它有什么问题? – 2010-11-01 05:52:45

回答

1

尝试在代码的开头为函数“makespace”,“split”,“convert”和“hexa”添加原型;我期望你看到的是隐式声明的函数与函数定义冲突的结果。另外,可以肯定的是,你的源文件中包含stdio.h和string.h,对吧?

+0

我发现my_data什么都没有〜有什么想法吗? data_len = atoi(getenv(“CONTENT_LENGTH”)); my_data =(char *)malloc(sizeof(char)*(data_len + 1)); fread(my_data,1,data_len,stdin); – friends 2010-11-01 07:29:12

+0

好吧,“my_data什么都没有”是有点模糊的,我认为这与原来的问题完全无关,但是我们还是先来看看。我假设你的意思是'my_data'在'malloc'后是NULL。您可能希望确认环境变量CONTENT_LENGTH实际上已设置为理智值,甚至可以设置为完全。 – FuriousLuke 2010-12-07 00:38:22

相关问题