Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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
如何在C中拆分字符串、存储在数组中以及传递几个函数_C_Arrays_String - Fatal编程技术网

如何在C中拆分字符串、存储在数组中以及传递几个函数

如何在C中拆分字符串、存储在数组中以及传递几个函数,c,arrays,string,C,Arrays,String,我觉得这是很基本的东西。我的C/C++已经生锈了。。14年前就用过了。。从那时起,我一直在用perl、shell和python进行编码,在C代码中遇到了一个令人沮丧的问题: 我在argv[7]中有一个类似下面的字符串: 最小值:最大值:两者:两者 我想用冒号将其拆分并存储到数组中。然后我想访问数组的某个元素,将其传递给字符串变量,并将其传递给几个函数。。我的问题是定义字符串数组,然后在函数间传递字符串,这在脚本语言中是非常基本的东西 我正在做这样的事情: int main(int argc, c

我觉得这是很基本的东西。我的C/C++已经生锈了。。14年前就用过了。。从那时起,我一直在用perl、shell和python进行编码,在C代码中遇到了一个令人沮丧的问题:

我在argv[7]中有一个类似下面的字符串: 最小值:最大值:两者:两者

我想用冒号将其拆分并存储到数组中。然后我想访问数组的某个元素,将其传递给字符串变量,并将其传递给几个函数。。我的问题是定义字符串数组,然后在函数间传递字符串,这在脚本语言中是非常基本的东西

我正在做这样的事情:

int main(int argc, char ** argv){
    int iy = 0;
    char * y = (char *)malloc(20*sizeof(char));
    char * tky = strtok(argv[7], ":");
      do {
        sprintf(y[iy],tky);
        printf("as string = %s and as array value = %s\n", tky, y[iy]);
        //printf("as string = %s \n", tky);
        iy++;
      } while((tky=strtok(NULL,":"))!=NULL);

      int measquant = 3;
      char colminmax[20];
        for(i=0; i<measquant; i++){
           sprintf(colminmax,"%s",y[i]);
           testfunction(colminmax);
         }
      return 0;
      }


      testfunction (char* dir){
              printf("dir is %s",dir);
         }
它正在正确打印tky,y[iy]为空 然后我尝试将其分配和传递为:

请帮助我,我错过了什么。我已经搜索了许多C/C++帮助网站,但无法找到基本的内容

在char*y=char*malloc20*sizeofchar中,y充当字符数组。它可以存储长达20字节的字符,包括空字符。但是您的意图是声明一个字符串数组

您必须声明字符串数组,我们称之为arr,并为数组中的每个元素分配内存。然后使用strcpy复制到该元素。也可以使用strdup,如下面的示例所示

您正在访问argv[7],但未检查argc>=7。请注意,命令行参数已作为数组提供

int main(int argc, char ** argv) 
{
    printf("argc = %d\n", argc);
    for(int i = 0; i < argc; i++)
        printf("argv[%d] = %s\n", i, argv[i]);

    int count = 0;
    char **arr = malloc(20 * sizeof(char*));

    //commented out for testing
    //if(argc < 7) return 0;
    //char *token = strtok(argv[7], ":");

    //use source instead of argv[7] for testing
    char source[] = "Min:Max:Both:Both";

    char *token = strtok(source, ":");
    while(token)
    {
        arr[count++] = strdup(token);
        token = strtok(NULL, ":");
    }

    for(int i = 0; i < count; i++)
        printf("%s\n", arr[i]);

    return 0;
}

14年前是。。。2003? 但是你仍然在写C而不是C++…不管怎么说,请发布重现问题的代码,这些代码片段并没有它们可能的那么有用。重点是strtok是臭名昭著的。这几乎总是最糟糕的。顺便说一句,main的可能副本被指定为返回int类型。y是指向20个字符的指针。您可以使用它来存储单个字符串,最多19个字符。但您似乎将其用作数组或字符串。你应该重新考虑这一部分。我在VS上试过,gcc无法复制你所说的错误。你一定改变了什么,我不知道。谢谢Barmak。它解决了这个问题。我之前犯了一个错误。不,我不小心声明了一个malloc of char而不是char*: