如何将运行时可变的字符串作为参数传递给函数?
运行时可变字符串作为函数参数的实现方法
首先得明确你的真实需求,因为你给出的代码写法对应的行为和“生成可变字符串”可能不是一回事,分两种情况说明:
情况1:遍历字符串字面量的后缀子串
如果你的目的是每次调用foo时传入"String"从第i个字符开始的子串(比如i=0传"String",i=1传"tring",依此类推),那你的思路方向是对的,但需要修正类型兼容问题:
字符串字面量(比如"String")在C语言中是不可修改的const char[]类型,而你的foo函数参数是char*,直接传递会触发类型不兼容警告,且如果foo内部尝试修改字符串会导致未定义行为。正确的做法有两种:
- 修改
foo的参数为const char*(推荐,因为不需要修改字符串)
#include <stdio.h> // 修改参数为const char*,明确表示不会修改传入的字符串 void foo(const char *string) { printf("Received: %s\n", string); } int main() { int n = 6; // "String"的字符数是6,n不能超过这个值 const char *base_str = "String"; for(int i=0; i<n; i++){ foo(base_str + i); // base_str+i指向第i个字符,即对应后缀子串 } return 0; }
- 将字符串字面量复制到可修改的数组中(如果
foo必须修改字符串)
#include <stdio.h> #include <string.h> void foo(char *string) { // 示例:修改第一个字符为大写 if(*string >= 'a' && *string <= 'z') { *string -= 32; } printf("Modified: %s\n", string); } int main() { int n = 6; char str_buf[] = "String"; // 把字面量复制到栈数组,可修改 for(int i=0; i<n; i++){ foo(str_buf + i); } return 0; }
情况2:生成带序号的可变字符串(比如"String0"、"String1")
如果你的真实需求是每次循环生成一个带有递增数字的新字符串传给foo,那原来的写法完全错误("String"+i只是偏移指针,不是拼接数字),需要主动构建可变字符串:
方法1:用栈上的字符数组(适合字符串长度固定且较小的场景)
#include <stdio.h> #include <string.h> void foo(char *string) { printf("Received: %s\n", string); } int main() { int n = 5; char buf[20]; // 定义足够大的缓冲区,容纳前缀+数字+结束符 const char *prefix = "String"; for(int i=0; i<n; i++){ // 把前缀和数字拼接进缓冲区 snprintf(buf, sizeof(buf), "%s%d", prefix, i); foo(buf); // 传递缓冲区地址 } return 0; }
方法2:动态分配内存(适合字符串长度不确定的场景)
#include <stdio.h> #include <stdlib.h> #include <string.h> void foo(char *string) { printf("Received: %s\n", string); } int main() { int n = 5; const char *prefix = "String"; int prefix_len = strlen(prefix); for(int i=0; i<n; i++){ // 先计算数字的字符长度 int num_len = snprintf(NULL, 0, "%d", i); // 分配足够的内存:前缀长度 + 数字长度 + 1(结束符) char *dynamic_str = malloc(prefix_len + num_len + 1); if(dynamic_str == NULL) { perror("Failed to allocate memory"); return 1; } // 拼接字符串 snprintf(dynamic_str, prefix_len + num_len + 1, "%s%d", prefix, i); foo(dynamic_str); free(dynamic_str); // 使用完必须释放内存,避免泄漏 } return 0; }
内容的提问来源于stack exchange,提问作者Mostack
相关产品推荐
相关产品推荐

