用两个旧字符制作一个新字符 我很乐意使用中间的C++代码,虽然C代码是首选。
我有如下代码:用两个旧字符制作一个新字符 我很乐意使用中间的C++代码,虽然C代码是首选。,c++,c,char,concatenation,C++,C,Char,Concatenation,我有如下代码: char *fileName1 = "graph"; char *extension1 = ".eps"; 我想创建一个新的char*变量,名为fileName1WithExtension1,它将对应于“graph.eps”,由上面给出的两个char*变量组成。如何做到这一点?您可以使用asprintf()函数 char *buffer; asprintf (&buffer, "%s%s", fileName1, extension1); 当buffer变量在代码中变
char *fileName1 = "graph";
char *extension1 = ".eps";
我想创建一个新的
char*
变量,名为fileName1WithExtension1
,它将对应于“graph.eps”,由上面给出的两个char*
变量组成。如何做到这一点?您可以使用asprintf()
函数
char *buffer;
asprintf (&buffer, "%s%s", fileName1, extension1);
当buffer
变量在代码中变得无用时,您必须使用释放asprintf为buffer分配的内存
free(buffer);
为了小幅度提高性能,如果编译器在优化方面足够聪明,请将最后一行更改为
strcpy(joined+strlen(fileName1), extension1)
最好在第一次确定变量时将FielnAME1的长度存储在变量中,并在最后的StrucYe()中使用它。
< P>如果使用C++,则将这些字符串作为: 然后简单地std::string fileName1WithExtension1 = filename1 + extension1;
如果需要将其传递给需要C字符串的C库函数,请使用fileName1WithExtension1.C_str()获取字符指针
在C++代码中,没有理由去处理普通C字符串。它是如此容易出错和乏味,因此应该积极避免它。如果您想使用丑陋的循环等低级别,您可以这样做:(经过测试,它编译并给出预期和期望的结果)
其中:
char* combine(char* str1, char* str2)
{
int str1len = 0, str2len = 0;
while(str1[str1len] != '\0') {
str1len++;
}
while(str2[str2len] != '\0') {
str2len++;
}
int outputlen = str1len + str2len + 1;
char* output = new char[outputlen];
for(int i = 0; i < str1len; i++)
{
output[i] = str1[i];
}
for(int i = str1len; i < outputlen; i++)
{
output[i] = str2[i - str1len];
}
return output;
}
char*组合(char*str1,char*str2)
{
int str1len=0,str2len=0;
while(str1[str1len]!='\0'){
str1len++;
}
而(str2[str2len]!='\0'){
str2len++;
}
int outputlen=str1len+str2len+1;
char*output=新字符[outputlen];
对于(int i=0;i
我做了一点C的乐趣,这里有一个替代的(C90和C++兼容代码),用于连接一个C字符串数组和分隔符。对于任何适当优化的编译器,它也应该非常有效:
#include <string.h>
#include <stdlib.h>
/* **parts are strings to join, a NULL-terminated array of char*
* sep is separator string, use "" for no separator, must not be NULL
* returns malloc-allocated buffer which must be freed
* if len_out!=NULL, sets *len_out to strlen of result string */
char *astrjoin(int *len_out, const char *sep, char **parts) {
int part_count;
int parts_total_len = 0;
for(part_count = 0; parts[part_count]; ++part_count) {
parts_total_len += strlen(parts[part_count]);
}
if (part_count > 0) {
int malloc_size = (part_count - 1) * strlen(sep) + parts_total_len + 1;
char *result = (char*)malloc(malloc_size);
char *dest = result;
for(;;) {
const char *src;
for(src=*parts; *src; ++src) *dest++ = *src;
if (!*++parts) break;
for(src=sep ; *src; ++src) *dest++ = *src;
}
*dest = 0;
if (len_out) *len_out = malloc_size - 1;
return result;
} else {
if (len_out) *len_out = 0;
return strdup("");
}
}
在你的问题中,可以这样称呼:
char *tmparr[] = { fileName1, exteansion1, NULL };
char *fileName1WithExtension1 = astrjoin(NULL, "", tmparr);
char *astrjoin_va(int *len_out, const char *sep, ...);
创建一个删除了sep
和/或len_out
的版本,或者一个支持“varargs”的版本,其签名类似于:
char *tmparr[] = { fileName1, exteansion1, NULL };
char *fileName1WithExtension1 = astrjoin(NULL, "", tmparr);
char *astrjoin_va(int *len_out, const char *sep, ...);
在你的问题中,哪一个更适合打电话:
char *fileName1WithExtension1 = astrjoin_va(NULL, "", fileName1, extension1, NULL);
考虑使用<代码> STD::String 。它们是不可修改的。@chris我大体上同意,但我不得不说,不变性有时是有用的。例如,Java字符串对象是不可变的。请注意,asprintf
是GNU扩展,不在任何标准中:为什么不使用strcpy
和strcat
?它们已经被编写和测试过了。请参阅C字符串库。请参阅DarenW的答案。@Thomasmatthew不使用strcpy的一个原因是,它们不会以任何方式返回字符串的结尾,这通常很不方便。但上面并没有利用这一点,而是在两个字符串上迭代两次,所以是的。。。
char *tmparr[] = { fileName1, exteansion1, NULL };
char *fileName1WithExtension1 = astrjoin(NULL, "", tmparr);
char *astrjoin_va(int *len_out, const char *sep, ...);
char *fileName1WithExtension1 = astrjoin_va(NULL, "", fileName1, extension1, NULL);