使用strcpy连接参数

时间:2017-08-16 14:57:31

标签: c

我想使用strcpy将所有参数连接到char指针。我这样做但我的输出只是一个空格。

我使用了3个变量:' concat ' (应该是我的输出),' 尺寸'获得所有参数的长度和' kar '这是我的参数迭代器。

#include<stdio.h>
#include<string.h>
int main(int argc, char **argv)
{
    int kar;
    int size;
    char *concat;

    kar = 1;
    size = 0;
    //find size to malloc concat
    while (kar < argc)
    {
            size = size + strlen(argv[kar]);
            kar++;
    }
    //malloc size + argc for space characters
    concat = malloc(size + argc);
    kar = 1;
    while (kar < argc)
    {
            strcpy(concat,argv[kar]);
            strcpy(concat," ");
            kar++;
    }
    printf("%s",concat);
}

4 个答案:

答案 0 :(得分:5)

strcpy() 复制字符串,如名称所示。因此,每次调用它时,都会覆盖现有字符串。您正在寻找strcat(),它通过搜索目标中的第一个0字节并在那里进行复制来连接。

如果您首先初始化strcpy(),则可以在代码中将strcat()替换为concat[0] = 0;

答案 1 :(得分:2)

strcpy 将源的字符复制到指针中,因为您总是使用相同的地址,即该字符串的开头,它会一直覆盖您的旧字符串。 如果您按已经复制的字符数添加偏移量,它可以工作,这样就可以正确复制字符串并将其连接起来

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char **argv)
{
    int kar = 1;
    int size = 0;
    char *concat;

    size_t argl[argc];

    //find size to malloc concat
    while (kar < argc)
    {
            unsigned int arglen = strlen(argv[kar]);
            size += arglen;
            argl[kar] = arglen; // Save the length
            kar++;
    }

    //malloc size + argc for space characters
    concat = malloc(size + argc + 1);
    kar = 1;

    unsigned int offset = 0;
    while (kar < argc)
    {
            strcpy(concat+offset,argv[kar]);
            offset += argl[kar];  // Offset by the length
            strcpy(concat+offset," ");
            offset += 1;
            kar++;
    }
    printf("%s",concat);
}

答案 2 :(得分:0)

考虑使用snprintf();它也可以工作,在某些情况下更容易使用。

snprintf(destination, buffer_size, source)基本上是strcpy,返回值告诉您复制了多少字节。

snprintf(destination + strlen(destination), buffersize - strlen(destination), new string to add on)

这会进行连接,但也允许您使用格式%d等插入变量。

答案 3 :(得分:0)

对于初学者,您应该包含标题<stdlib.h>,其中声明了函数mallocfree

通常argc可以等于0.因此,最好明确地将一个字节保留到终止零而不是使用表达式size + argc

函数strcpy会覆盖目标字符串的先前内容。复制第一个命令行参数时,只应使用该函数一次。在所有其他情况下,您应该使用标准函数strcat

此外,您应该在退出程序之前释放已分配的内存。

程序可以按以下方式查看

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( int argc, char * argv[] )
{
    size_t n = 0;

    for ( int i = 1; i < argc; i++ ) n += strlen( argv[i] );

    if ( argc > 1 ) n += argc - 2;

    ++n;

    char *s = malloc( n );

    s[0] = '\0';

    for ( int i = 1; i < argc; i++ )
    {
        if ( i == 1 )
        {
            strcpy( s, argv[i] );
        }            
        else
        {            
            strcat( s, " " );
            strcat( s, argv[i] );
        }
    }

    puts( s );

    free( s );

    return 0;
}

如果要指定命令行参数,例如

first second third

然后输出

first second third