c - 在 C 中创建字符串并将其传递给函数的最佳方法?

标签 c string pointers char

我想创建一个字符串并将其传递给函数,以便在它被修改时发挥作用。我想实现这种编写最少代码的可能。执行此操作的最佳方法是什么?

下面的片段是我对这个问题的看法。它确实可以编译,但是不会产生预期的结果。我在函数 stringA() 中定义了字符串。这个想法是 stringA() 将函数传递给函数(即 stringB()stringC()...),因为它被修改. condition() 将始终返回 0,如果我们需要进行有条件的返回,这只是一个用例。

static inline int condition(void)
{
#ifdef SIM
    return 1;
#else
    return 0;
#endif
}

const char *stringA(void)
{
    return condition() ? "." : "/mnt/mmcblk0p1";
}

static inline const char *stringB(void)
{
    char buf[128];
    snprintf(buf, sizeof(buf), "%s/pathB", stringA());
    return condition() ? "" : buf;
}

void main()
{
      /* Pass 1 */
      char *str1 = strdup(stringB());
      printf("%s\n", str1); 

      /* Pass 2 */
      char *str2 = stringB();
      printf("%s\n", str2);

      /* Pass 3 */
      char str3[256];
      strcpy(str3, stringB());

      return;
}

更多问题和反馈:

1) Pass 1 不打印任何东西。为什么?

2) Pass 2 不打印任何东西。又是为什么?我认为使用 strdup() 会将所有字符指针传递给 str2

3) 第 3 次 打印垃圾(不需要的字符)。为什么?我选择不使用指针。 strcpy() 似乎不起作用。

4) 我从 return 语句中删除了 condition() 并且出现了段错误。为什么?

static inline const char *stringB(void)
{
    char buf[128];
    snprintf(buf, sizeof(buf), "%s/pathB", stringA());
    return buf;
}

5) 但是,下面的这种方法(我使用了参数)似乎可以很好地打印出“/mnt/mmcblk0p1/pathB”。当我的其他尝试失败时,我不确定它是如何工作的。有什么解释吗?我不是特别喜欢这种方法,因为它需要我创建不必要的参数并在 main()

中创建一个不必要的 *buf 变量
static inline const char *stringB(char *buf, int len)
{
    snprintf(buf, len, "%s/pathB", stringA());
    return condition() ? "" : buf;
}

void main()
{
      char *buf;
      char *str1 = strdup(stringB(buf, 128));
      printf("%s\n", str1); //It prints 
      return;
}

最佳答案

static inline const char *stringB(void)
{
    char buf[128];
    snprintf(buf, sizeof(buf), "%s/pathB", stringA());
    return condition() ? "" : buf;
}

基本上你不想这样做.... 在这里返回 buf,返回的是堆栈上的内存,将被其他东西重新使用......也许是调用函数......无论如何它不是你的内存......你可以返回 "" 那是一个静态的 char * 并且不能改变... 如果你想返回一个字符串,它必须在一个传递给函数的缓冲区中,比如:

static inline const char *stringB(char *buf, size_t len)
{
    snprintf(buf, len, "%s/pathB", stringA());
    return condition() ? "" : buf;
}

返回你刚刚传入的缓冲区没有多大意义......但它是合法的......

或者在函数中malloced;

static inline const char *stringB(void)
{
    char * buf = malloc(128);
    snprintf(buf, 128, "%s/pathB", stringA());
    return condition() ? "" : buf;
}

关于c - 在 C 中创建字符串并将其传递给函数的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57468321/

相关文章:

c++ - 桌面集成应用程序(类似桌面小部件)

Java检测字符串中的双双引号

java - 匹配双引号但不匹配反斜杠双引号的正则表达式

arrays - 为什么结构数组比较有不同的结果

c - 是否有操作系统允许应用程序程序员从 thunk 中创建指针?

c - fork 函数不分配指针

c - 如何修改我的代码以使用 strtol() 而不是 scanf() 来仅读取前两个整数?

c - 在c中查找数组中的重复值

c - '!'在输入缓冲区中与 if 语句中的比较

java - Swig,将c指针转换为float[]