连接多个字符串?

时间:2011-03-05 19:29:01

标签: c string concatenation

我正在处理一个输入字符串,它由一个进程名称组成,后跟任意数量的参数。

我需要一个字符串中的进程名称以及所有参数。 我以为我可以在循环中使用strcat,以便循环遍历所有args并且每次将arg附加到字符串,但是我遇到了一个问题,即获取一个空的字符串来开始循环。

任何人都可以帮我解决一些基本代码吗?

感谢。

编辑: 为了清楚起见,我发布了我的代码。 Mike的帖子最接近我现在的帖子:

    char * temp;
    strcpy(temp,"");
    for (i = 4; i < argc-1; i++) // last arg is null, so we need argc-1
    {
        strcat(temp,argv[i]);
        strcat(temp," ");
    }

暂时忽略我的for循环中的4(幻数,我知道。) 我正在使用此代码获得段错误。是因为我的字符串分配?我认为是这种情况,因此我问了如何组合字符串的问题。

5 个答案:

答案 0 :(得分:5)

假设你的输入字符串是一个char指针数组,暗示称为argv,长度为argc

我们首先需要确定输出需要多少空间:

int length = 0;
for (int i = 0; i < argc; ++i)
    length += strlen(argv[i]);

然后我们分配它,为char终结符添加额外的'\0'

char *output = (char*)malloc(length + 1);

最后,连接:

char *dest = output;
for (int i = 0; i < argc; ++i) {
    char *src = argv[i];
    while (*src)
        *dest++ = *src++;
}
*dest = '\0';

请注意,我在这里不使用strcat。原因是这为我们设置了Schlemiel the Painter's algorithm:对于每次迭代,将扫描整个输出字符串以找到它的结束,从而产生二次运行时间。

完成后不要忘记释放输出字符串:

free(output);

我有点累,所以我可能会在这里忽略一些东西。使用标准库函数的更好的解决方案是受欢迎的。如果strcat返回指向dest中的终结符字节的指针,那将会很方便。

答案 1 :(得分:1)

你想要一个空的C字符串?这是你在找什么:char p[] = "";


<强>更新

发布一些代码后,很明显您忘记分配缓冲区temp。只需首先运行参数,计算所需的长度(使用strlen),然后分配temp。不要忘记零终结器的空间!

答案 2 :(得分:0)

您可以将“任意数量的参数”作为一个参数提供,即数组/列表,然后执行此伪代码:

str = "";
i = 0;
while i < length of input
{
str = strcat ( str , input[i]);
i++;
}

答案 3 :(得分:0)

C中的字符串由一个字符数组表示,该字符数组以“null”字符“0”结尾,其值为0.这使得所有字符串函数都知道字符串结尾的位置。这里是探索声明空字符串的不同方法,以及它们的含义。

获取空字符串的常用方法是

char* emptyString = "";

但是,emptyString现在指向一个字符串文字,无法修改。如果您希望连接循环中的空字符串,则必须在初始化时将其声明为数组。

char buffer[] = "";

这为您提供了一个大小为1的数组。即buffer[0]是0.但是你想要一个数组连接到它 - 它必须足够大以容纳字符串。因此,如果你有一个特定大小的字符串缓冲区,你可以将它初始化为空,如下所示:

char buffer[256] = "";

buffer处的字符串现在是“空字符串”。它包含的内容是buffer[0]为0,缓冲区的其余条目可能是垃圾,但是一旦连接其他字符串,这些条目就会被填充。

不幸的是,C的问题是,你永远不会有一个“无限”的字符串,你可以安全地连接,你 从一开始就知道它的确定大小。如果您的参数数组也是字符串,则可以使用strlen找到它们的长度。这为您提供了一个字符串的长度,没有空字符。一旦知道所有子字符串的长度,您就会知道最终缓冲区的长度。

int totalSize; // assume this holds the size of your final concatenated string
// Allocate enough memory for the string. the +1 is for the null terminator
char* buffer = malloc(sizeof(char) * (totalSize + 1));
buffer[0] = 0; // The string is now seen as empty.

在此之后,您可以使用strcat自由连接字符串。

答案 4 :(得分:0)

    #include<stdio.h>
    #include<stdarg.h>

    int main(int argc, char** argv) { 
            // the main parameters are the same situation you described
            // calling this program with    main.exe asdf 123 fdsa, the program prints out: asdf123fdsa

            int lengths[argc];
            int sum =0;
            int i;
            for(i=1; i<argc; i++) { // starting with 1 because first arg is program-path
                    int len = strlen(argv[i]);
                    lengths[i] = len;
                    sum+=len;
            }
            char* all = malloc(sum+1);
            char* writer = all;
            for(i=1; i<argc; i++) {
                    memcpy(writer, argv[i], lengths[i]);
                    writer+=lengths[i];
            }
            *writer = '\0';
            printf("%s\n", all);

            system("pause");
            return 0;
    }