Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用两个旧字符制作一个新字符 我很乐意使用中间的C++代码,虽然C代码是首选。_C++_C_Char_Concatenation - Fatal编程技术网

用两个旧字符制作一个新字符 我很乐意使用中间的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);