gpt4 book ai didi

c - 在 C 中返回字符串的正确方法

转载 作者:太空狗 更新时间:2023-10-29 14:54:46 26 4
gpt4 key购买 nike

我有以下代码:

char* get_address_string(PACKAGE* pkg){
char *c;
sprintf(c, "%02x:%02x:%02x:%02x:%02x:%02x", pkg->address[0], pkg->address[1],
pkg->address[2], pkg->address[3], pkg->address[4], pkg->address[5]);
return c;
}

代码运行良好。但是,我知道这不是在 C 中返回字符串的正确方法。我收到警告“c 在此函数中使用未初始化”。

用 C 编写这个函数的正确方法是什么?

最佳答案

“在 C 中返回字符串的正确方法”是不可能的。在 C 语言中,字符串 是一个字符数组(直到并包括空字符)并且数组本身不能从函数返回。

函数可以返回指针。所以“返回一个字符串”的通常方法是:

  1. 返回一个指针。 char *foo1(...) 类似于 char *strdup()

  2. 传入一个指向字符数组的指针并修改其内容。 void foo2(char *,...) 类似于 int sprintf(char *dest, const char *format, ...)

  3. 合并 1 和 2 char *foo3(char *, ...) 就像 char *strcpy(char *dest, char *src)

  4. 传递指针的地址并更新它。 foo4(char **ptr) 类似于 ssize_t getline(char **lineptr, size_t *n, FILE *stream)

关键是指针关联的内存必须在函数完成后有效。返回指向函数的非静态内存的指针是未定义的行为。成功的方法包括让调用代码传入指针,或者函数通过将指针的内存分配指向某个持久值(如全局变量或字符串常量)来提供指针。

What is the proper way to write this function in C?

当前的设计实践鼓励像上面的 #2 和 #3 这样的函数也提供 size_t 大小,这样函数就知道可用内存的限制。

    char *foo2(char *s, size_t size, const pkg_T *pkg) {
int result = snprintf(s, size, "%02x:%02x:%02x:%02x:%02x:%02x",
pkg->address[0], pkg->address[1], pkg->address[2],
pkg->address[3], pkg->address[4], pkg->address[5]);
// encoding error or not enough room
if (result < 0 || result >= size) return NULL;
return s;
}

另一种方法是分配内存(不过我更喜欢上面的方法)。这迫使调用代码free() 内存。

    #define UINT_MAX_WIDTH (sizeof(unsigned)*CHAR_BIT/3 + 3)

char *foo2alloc(char *s, size_t size, const pkg_T *pkg) {
char buf[(UINT_MAX_WIDTH+3)*6 + 1];
int result = snprintf(buf, sizeof buf, "%02x:%02x:%02x:%02x:%02x:%02x",
pkg->address[0], pkg->address[1], pkg->address[2],
pkg->address[3], pkg->address[4], pkg->address[5]);
// encoding error or not enough room
if (result < 0 || result >= size) return NULL;
return strdup(buf);
}

关于c - 在 C 中返回字符串的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31411831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com