我如何返回一个字符串,其字符在C函数中被修改

问题描述

我想创建一个带有一个int参数0或1的函数,并根据它返回字符串“ a == b”或“ a!= b”。

要返回字符串,它应该是字符串文字char *s,但不支持s[0] = 'a'。但是,如果我将其设置为char s[20],则无法将其退回。

这是我尝试做的。但这不起作用。

#include <stdio.h>

char *func(int param){
    char s[20];
    
    s[0] = 'a';
    
    if(param)
        s[1] = '!';
    else
        s[1] = '=';
    
    s[2] = '=';
    s[3] = 'b';
    
    return s;
}

int main()
{
    printf("String: %s",func(0));
    return 0;
}

我该怎么做?

(我还读到我可以通过在堆中分配内存并返回它来做同样的事情,但是随后我将不得不在main函数中释放它。因此,我不想这样做。 )

谢谢。


更新

上述示例的可能解决方案是返回两个不同的字符串“ a == b”或“ a!= b”,但这不是我期待的方法。这只是我想做的一个简单示例。

我真正想要做的是遍历输入字符串'0'和'1',并根据返回的另一个字符串'0'和'1'(例如该字符串的补码),所以我想做s [ i] =“ 0”。那我该怎么办?

解决方法

-您可以使用malloc分配内存并返回指向它的指针。呼叫者将可以释放内存。

-您可以将指针传递给预分配的字符串:

char *func(char *s,int param) {
    ...
    return s;
}

int main() {
   char s[20];
   printf("...",func(s,20));
   // or
   printf("...",func((char[20]){0},20));
}

-您可以使用在文件作用域或块作用域定义了静态存储持续时间的数组(或者可以是指向有效数组的静态存储持续时间的指针)-即。使用全局变量:

char s[20];
char *func(int param){
    ....
    return s;
}
// or
char *func(int param){
    static char s[20];
    ....
    return s;
}  
,

无需为了符号'!''='而构建字符串。

只需定义类似的功能

const char * func( int param )
{
    return param == 0 ? "a == b" : "a != b";
}

或者这样

const char * func( _Bool param )
{
    return param ? "a != b" : "a == b";
}

如果需要更复杂的东西,则需要使用例如函数malloccalloc在函数内动态分配一个字符数组,并从该函数返回指向已分配内存的指针。

或者,您也可以将已经在main中定义的数组传递给函数,该数组将在函数中更改。

,

问题在于,在func()完成时,数组s将在内存中删除。因此,当您将指针传递回并打印时,计算机将寻址已被删除的内存空间。这就是为什么当它运行printf时显示为空。我的建议是在通过引用传递的地方使用这种函数原型:

char *func(int param,char s[]){
,

为避免使用malloc(并且如果您在利用最后一个调用的结果之前不会再对“ func”进行调用,则可以通过使s为静态来解决此问题:

static char s[20];

这意味着它将从堆而不是堆栈中分配,并且在函数返回后它将继续存在。但是,下次调用func时,s的旧内容将被覆盖。