我正在处理一个输入字符串,它由一个进程名称组成,后跟任意数量的参数。
我需要一个字符串中的进程名称以及所有参数。 我以为我可以在循环中使用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(幻数,我知道。) 我正在使用此代码获得段错误。是因为我的字符串分配?我认为是这种情况,因此我问了如何组合字符串的问题。
答案 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;
}