解码器函数在C中返回垃圾字符串如何修复?

时间:2015-01-19 03:36:26

标签: c string

以下是我所做的简化解码函数,它应该采用特定大小的字符串,并返回字符串,每个字符的ascii值比原始字符串中相同位置的原始字符少一个。

例如,如果我使用参数" BCDEF" 5,那么我应该能够拥有" ABCDE"但是,我回来的主要是垃圾。

char* dec(char* s,int sz){
int x=0;
unsigned char p=0;
char ss[sz];
if (s){
    for (x=0;x<sz;x++){
        p=s[x];
        p=p-1;
        ss[x]=p;
    }
    return ss;
}
else{return s;}

}

以下是我从外面打电话的方式:

char *item="BCDEF",*item2="     ";
item2=dec(item,5); 
printf("item= %s",item2);

将item2的结果打印为字符串会产生垃圾,即使我尝试保留固定大小。

编译代码也会产生&#34;警告:函数dec返回局部变量的地址&#34;但我并没有在变量前加上&amp;。

我将如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

ssdec函数中的Local(数组)变量。当函数结束时,数组不再存在,当您稍后访问该指针/地址时Undefined behavior

而不是将本地数组放在堆栈上,malloc它:

char *ss = malloc(sizeof(char)*(sz+1)); //+1 for NUL char 
//do something
return ss;

当您不需要时,使用free清除内存。

答案 1 :(得分:0)

试试这个:

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

void dec(char *s, int sz, char *ret)
{
    if ( s == NULL )
    {
        printf ( "\n entered string have NULL value\n " );
        exit ( 0 );
    }

    while ( *s != NULL )
    {
        *ret = (int)*s - 1 ;
        s++;
        ret++;
    }
    *ret = '\0';
}

int main ( void )
{

char * ret = NULL;
ret = (char * ) malloc (5 * sizeof (char ));
dec ("code" , 5, ret );

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

free ( ret );

return ( 0 );
}