我如何 return 一个字符串,其字符在 C 的函数内被修改

How can I return a string whose characters are being modified inside a function in C

我想创建一个函数,它接受一个 int 参数 0 或 1,并根据它 return 一个字符串“a==b”或“a!=b”。

要return一个字符串,它应该是一个字符串文字,char *s但是不支持s[0] = 'a'。但是如果我把它变成 char s[20] 那么我就不能 return 它。

这是我尝试过的。但这是行不通的。

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

我怎样才能这样做?

(我还读到我可以通过在堆中分配内存并 returning 来做同样的事情,但是我必须在 main 函数中释放它。所以,我不想这样做。)

提前致谢。


更新

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

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

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

定义函数就好了

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

或者这样

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

如果你需要更复杂的东西,那么你需要在函数中动态分配一个字符数组,例如使用函数 malloccalloc 和 return 来自函数的指针指向分配的内存。

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

- 您可以使用 malloc 和 return 指向它的指针来分配内存。调用方将可用于释放内存。

- 您可以传递一个指向预分配字符串的指针:

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

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

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

为了避免使用 malloc(并且如果您在使用上次调用的结果之前不会再次调用“func”,那么您可以通过将 s 设置为静态来解决此问题:

static char s[20];

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