调整argVector
我的部分程序如下所示:调整argVector,c,linux,C,Linux,我的部分程序如下所示: char *argVector[] = {"./doTasks","0", "1", "3", NULL}; int numChild = 3; int temp; char tempstring[100]; for (int i = 0; i < numChild; i++) { temp = sprintf(tempstring, "%d", i); argVector[1] = tempstring; temp = sp
char *argVector[] = {"./doTasks","0", "1", "3", NULL};
int numChild = 3;
int temp;
char tempstring[100];
for (int i = 0; i < numChild; i++)
{
temp = sprintf(tempstring, "%d", i);
argVector[1] = tempstring;
temp = sprintf(tempstring, "%d", 1 + i*3);
argVector[2] = tempstring;
printf("argVector is now: %s %s %s %s %s\n", argVector[0], argVector[1], argVector[2], argVector[3], argVector[4]);
}
char*argVector[]={./dotask”,“0”,“1”,“3”,NULL};
int numChild=3;
内部温度;
char tempstring[100];
for(int i=0;i
我的预期输出如下:
第一圈:
argVector[]={../dotask”,“0”,“1”,“3”,NULL}
第二圈:
argVector[]={../dotask”,“1”,“4”,“3”,NULL}
第三圈:
argVector[]={../dotask”,“2”,“7”,“3”,NULL}
但在实际的控制台显示屏上,我看到:
第一圈:
argVector[]={../dotask”,“1”,“1”,“1”,NULL}
第二圈:
argVector[]={../dotask”,“4”,“4”,“4”,NULL}
第三圈:
argVector[]={../dotask”,“7”,“7”,“7”,NULL}
我当前的程序是关于Linux中的多处理的(通过execvp()将argVector传递给子进程;doTasks.c是另一个供子进程实现的c程序)。无论如何,在走得太远之前,我现在已经被困在操纵argVector中了。有人能解释这个奇怪的输出吗?提前多谢 请注意,与其他语言不同,C语言中没有真正的字符串类型
char*argVector[]
不是字符串数组,而是指针数组
你想要这个:
#include <stdio.h>
int main()
{
char *argVector[] = { "./doTasks","0", "1", "3", NULL };
int numChild = 3;
char string1[100];
char string2[100];
for (int i = 0; i < numChild; i++)
{
sprintf(string1, "%d", i);
argVector[1] = string1;
sprintf(string2, "%d", 1 + i * 3);
argVector[2] = string2;
printf("argVector is now: %s %s %s %s %s\n", argVector[0], argVector[1], argVector[2], argVector[3], argVector[4]);
}
}
这样我们甚至不需要string1
,我们可以直接“打印”到argVector
这里的
argVector
或多或少是一个由5个字符串组成的数组,每个字符串最多可以包含20个字符,包括NUL终止符。提示:argVector[1]=tempstring
正在分配指针,而不是复制字符串。此外,您的代码与您在问题中所写的不同。结果是argVector[]={./doTasks”,“1”,“1”,“3”,NULL}
,argVector[]={./doTasks”,“4”,“4”,“3”,NULL}
,等等。非常抱歉,因为我在发布之前对代码做了一些修改(为了方便起见,我将argVector[3]硬编码为“3”)。对于argVector[3],该值实际上基于用户输入(用户输入一个整数,然后使用sprintf()进行字符串转换并将其存储到argVector[3]…),该值出现在用于操作argVector[1]和argVector[2]的For循环之前。但我相信输出不匹配基本上与您提到的(“分配指针”与“复制字符串”)有关。太好了!我可以看到您在程序中声明了string2。但我想澄清的一点是,当调用第二个sprintf()时,string1不应该被覆盖吗?(假设我只声明string1而不是string1和string2,则string1中的“i”替换为“1+i*3”)。为什么我需要两个临时持有人?非常感谢@NicholasChin实际上这两个字符串不是临时的,它们必须同时存在。如果只有string1
,问题也会一样argVector[1]
和argVector[2]
不是字符串,它们是指向字符串的指针。如果你想用C语言编程,除了最基本的东西外,你需要熟悉指针的概念。因此,如果它是char argVector[5]={……},那么我前面的内容是完全正确的。刚才是char*argVector[]={……},所以我不能直接在这里复制字符串。我在正确的轨道上吗?完全没有,charargvector[5]={……}
声明了一个由5个char
s组成的数组。我会加强我的回答。等一下。啊,我明白了!我只是把C和C++混合在一起。因此,C++中的String []与C.的char []]相当,所以char ARGVATION[5 ]{{}是一个5字符数组,而Char AgValp[5 ][20 ]是5个字符串(CHAR[])的数组,每个都有20的长度。我说得对吗?
#include <stdio.h>
int main()
{
char argVector[5][20] = { "./doTasks","0", "1", "3", NULL };
int numChild = 3;
for (int i = 0; i < numChild; i++)
{
sprintf(argVector[1], "%d", i);
sprintf(argVector[2], "%d", 1 + i * 3);
printf("argVector is now: %s %s %s %s %s\n", argVector[0], argVector[1], argVector[2], argVector[3], argVector[4]);
}
}