我如何 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";
}
如果你需要更复杂的东西,那么你需要在函数中动态分配一个字符数组,例如使用函数 malloc
或 calloc
和 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 的旧内容将被覆盖。
我想创建一个函数,它接受一个 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";
}
如果你需要更复杂的东西,那么你需要在函数中动态分配一个字符数组,例如使用函数 malloc
或 calloc
和 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 的旧内容将被覆盖。