Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调整argVector_C_Linux - Fatal编程技术网

调整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]);
  }
}