C 创建包含以前声明的字符串变量的新字符串
我想做一些类似这样的事情(虽然显然不是有效的c代码): 这是我的方式,但它似乎太复杂了。获取test和new的len,创建一个可以容纳这两个长度的新字符串缓冲区,将new和test连接到字符串缓冲区。有更好的方法吗C 创建包含以前声明的字符串变量的新字符串,c,C,我想做一些类似这样的事情(虽然显然不是有效的c代码): 这是我的方式,但它似乎太复杂了。获取test和new的len,创建一个可以容纳这两个长度的新字符串缓冲区,将new和test连接到字符串缓冲区。有更好的方法吗 还有char hi[]=“hi”vschar*hi=“hi”。有什么区别吗?不,这就是它在C中的工作原理。哦,别忘了为终止的'\0'分配一个字节 不过,有很多库以更舒适的方式处理字符串。不,这就是它在C中的工作方式。哦,别忘了为终止的'\0'分配一个字节 不过,有很多库以更舒适的方式
还有
char hi[]=“hi”
vschar*hi=“hi”
。有什么区别吗?不,这就是它在C中的工作原理。哦,别忘了为终止的'\0'
分配一个字节
不过,有很多库以更舒适的方式处理字符串。不,这就是它在C中的工作方式。哦,别忘了为终止的
'\0'
分配一个字节
不过,有很多库以更舒适的方式处理字符串。您可以使用
snprintf
进行实际的字符串格式化,但需要手动计算大小:
char newstring[19];
snprintf(newstring, 19, "hey %s over there", test);
请注意,如果要动态计算组成字符串的长度,就不能真正拥有一个常量大小的数组(即,除了一些实际常量之外,没有“常量表达式”可以代替19
)。要么接受C99的可变长度数组,要么分配动态内存:
char * newstring = malloc(computed_size_of_new_string);
另一种选择是分配一些大的静态缓冲区,
charnewstring[2048]
,然后检查snprintf
的结果以查看是否发生截断。您可以使用snprintf
进行实际的字符串格式化,但需要手动计算大小:
char newstring[19];
snprintf(newstring, 19, "hey %s over there", test);
请注意,如果要动态计算组成字符串的长度,就不能真正拥有一个常量大小的数组(即,除了一些实际常量之外,没有“常量表达式”可以代替19
)。要么接受C99的可变长度数组,要么分配动态内存:
char * newstring = malloc(computed_size_of_new_string);
另一种选择是分配一些大的静态缓冲区,
charnewstring[2048]代码>,然后检查snprintf
的结果以查看是否发生了截断。好吧,这是在C中进行此操作的由来已久的传统方法,尽管我认为您指的是test
的长度,而字符串literal,因为new
直到您将数据写入其中后才有长度
另外,如果你希望你的代码将在C++编译器中使用,请不要调用变量<代码>新< /代码>:-尽管我假设这只是一个快速和肮脏的代码示例,因为<代码>新< /COD>无论如何都不是一个好的描述性名称(<代码> NexSoist<代码>,或类似的,更好)。
如果您可能经常这样做,那么编写一个帮助器函数为您完成所有的繁重工作是没有问题的。这可能会使您的代码看起来更干净,但我只想使用strcpy/strcat/strlen/sprintf
等工具选择您当前的解决方案
或者,您可以使用第三方代码,如许可证和管理态度许可(许可证是BSD/GPL,但有时管理仍然可能是一个问题)
它的优点是不会像某些第三方库惯常做的那样拖入大量无关的功能。它所做的只是字符串处理
关于这两者的区别:
char hi[] = "hi";
char *hi = "hi";
第一个为您提供了一个可修改的字符数组,而第二个则不提供(请尝试hi[0]='a';
在这两种情况下,使用后者执行此操作将是未定义的行为)。后者还允许您将hi
指针的值更改为指向其他地方。好吧,这是在C中执行此操作的由来已久的传统方法,尽管我认为您指的是test
的长度,而字符串文本,因为new
在将数据写入它之前没有长度
另外,如果你希望你的代码将在C++编译器中使用,请不要调用变量<代码>新< /代码>:-尽管我假设这只是一个快速和肮脏的代码示例,因为<代码>新< /COD>无论如何都不是一个好的描述性名称(<代码> NexSoist<代码>,或类似的,更好)。
如果您可能经常这样做,那么编写一个帮助器函数为您完成所有的繁重工作是没有问题的。这可能会使您的代码看起来更干净,但我只想使用strcpy/strcat/strlen/sprintf
等工具选择您当前的解决方案
或者,您可以使用第三方代码,如许可证和管理态度许可(许可证是BSD/GPL,但有时管理仍然可能是一个问题)
它的优点是不会像某些第三方库惯常做的那样拖入大量无关的功能。它所做的只是字符串处理
关于这两者的区别:
char hi[] = "hi";
char *hi = "hi";
第一个为您提供了一个可修改的字符数组,而第二个则不提供(请尝试hi[0]='a';
在这两种情况下,使用后者执行此操作将是未定义的行为)。后者还允许您将hi
指针的值更改为指向其他地方。您可以使用sprintf函数
int main(int ac, char** argv)
{
char test[] = "you";
char new[] = "hey %s over there";
char* total;
int len = strlen(test) + strlen(new) + 1;
total = malloc(len);
total[len - 1] = '\0';
sprintf(total, new, test);
printf(total);
free(total);
return 0;
}
您可以使用sprintf函数
int main(int ac, char** argv)
{
char test[] = "you";
char new[] = "hey %s over there";
char* total;
int len = strlen(test) + strlen(new) + 1;
total = malloc(len);
total[len - 1] = '\0';
sprintf(total, new, test);
printf(total);
free(total);
return 0;
}