我想创建一个字符串并将其传递给函数,以便在它被修改时发挥作用。我想实现这种编写最少代码的可能。执行此操作的最佳方法是什么?
下面的片段是我对这个问题的看法。它确实可以编译,但是不会产生预期的结果。我在函数 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/