我想使用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);
}
答案 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>
,其中声明了函数malloc
和free
。
通常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