Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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_Function_Struct - Fatal编程技术网

如何将字符串数组传递给C中的函数?

如何将字符串数组传递给C中的函数?,c,arrays,string,function,struct,C,Arrays,String,Function,Struct,所以我有一个函数(makeStruct),它能够接收一个字符串并打印出结构的元素。例如,我传入的字符串是“a=2.b,1.d,3.d;4.o;milk cheese”,它通过我的函数将每个数字、字母和单词存储到我创建的相应结构元素中。这非常好,但只适用于一个字符串: #include <stdio.h> #include <stdlib.h> #include <string.h> struct stopPoints { int weights[1

所以我有一个函数(makeStruct),它能够接收一个字符串并打印出结构的元素。例如,我传入的字符串是
“a=2.b,1.d,3.d;4.o;milk cheese”
,它通过我的函数将每个数字、字母和单词存储到我创建的相应结构元素中。这非常好,但只适用于一个字符串:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stopPoints {
    int  weights[10];
    char connectingPoints[10];
    char *items[30];
    int startBool;
};


void makeStruct(char str[]){

    struct stopPoints myPoint;
    char *arr[30];
    char * pch;
    pch = strtok (str," ;=,.-");
    arr[0] = pch;
    int i=0;


  for (pch; pch != NULL; i++){
    pch = strtok (NULL, " ;=,.-");
    arr[i+1] = pch;
    //printf("%s\n", arr[i]);

  }
  printf("\n");
  char letters[10];
  int numbers[10];
  char *strings[10] = {NULL};
  int p, iter=0, iter2=0, iter3=0, val[10];
  for (p=0; arr[p] != NULL; p++){
      //if its a string
      if (isalpha(*arr[p]) && strlen(arr[p]) >=2 ){
        //printf("%s is a string\n", arr[p]);
        myPoint.items[iter] = arr[p];
        iter++;
      }
      //if its just a letter
      else if (isalpha(*arr[p]) && strlen(arr[p]) ==1){
        //printf("%s is a letter\n", arr[p]);
        letters[iter2] = *arr[p];
        myPoint.connectingPoints[iter2] = letters[iter2];
        iter2++;
        //printf("letter\n");
      }
      //if its a number
      else if (isdigit(*arr[p])){
        //printf("%s is a number\n", arr[p]);
        val[iter3] = atoi(arr[p]);
        myPoint.weights[iter3] = val [iter3];
        iter3++;
      }
  }



  printf("%s %s\n",  myPoint.items[0], myPoint.items[1]);

}


int main ()
{
        char str[] = "a = 2.b, 1.d, 3.d; 4.o; milk cheese";
        makeStruct(str);
  return 0;
}
#包括
#包括
#包括
结构停止点{
整数权重[10];
字符连接点[10];
字符*项目[30];
int startBool;
};
void makeStruct(char str[]{
结构停止点myPoint;
字符*arr[30];
char*pch;
pch=strtok(str,“;=,.-”;
arr[0]=pch;
int i=0;
for(pch;pch!=NULL;i++){
pch=strtok(空,;=,.-”;
arr[i+1]=pch;
//printf(“%s\n”,arr[i]);
}
printf(“\n”);
字符[10];
整数[10];
char*字符串[10]={NULL};
int p,iter=0,iter2=0,iter3=0,val[10];
for(p=0;arr[p]!=NULL;p++){
//如果是字符串
如果(isalpha(*arr[p])&strlen(arr[p])>=2{
//printf(“%s是一个字符串\n”,arr[p]);
myPoint.items[iter]=arr[p];
iter++;
}
//如果只是一封信
否则如果(isalpha(*arr[p])&strlen(arr[p])==1){
//printf(“%s是字母\n”,arr[p]);
字母[iter2]=*arr[p];
myPoint.connectingPoints[iter2]=字母[iter2];
iter2++;
//printf(“字母\n”);
}
//如果是一个数字
否则如果(isdigit(*arr[p])){
//printf(“%s是一个数字\n”,arr[p]);
val[iter3]=atoi(arr[p]);
myPoint.weights[iter3]=val[iter3];
iter3++;
}
}
printf(“%s%s\n”,myPoint.items[0],myPoint.items[1]);
}
int main()
{
charstr[]=“a=2.b,1.d,3.d;4.o;牛奶奶酪”;
makeStruct(str);
返回0;
}
现在,我希望能够将多个字符串传递到此函数中。这就是我的问题所在。我尝试过几种不同的方法,但我不知道我哪里出了问题。请看下面的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stopPoints {
    int  weights[10];
    char connectingPoints[10];
    char *items[30];
    int startBool;
};


void makeStruct(char str[]){

    struct stopPoints myPoint;
    char *arr[30];
    char * pch;
    pch = strtok (str," ;=,.-");
    arr[0] = pch;
    int i=0;


  for (pch; pch != NULL; i++){
    pch = strtok (NULL, " ;=,.-");
    arr[i+1] = pch;
    //printf("%s\n", arr[i]);

  }
  printf("\n");
  char letters[10];
  int numbers[10];
  char *strings[10] = {NULL};
  int p, iter=0, iter2=0, iter3=0, val[10];
  for (p=0; arr[p] != NULL; p++){
      //if its a string
      if (isalpha(*arr[p]) && strlen(arr[p]) >=2 ){
        //printf("%s is a string\n", arr[p]);
        myPoint.items[iter] = arr[p];
        iter++;
      }
      //if its just a letter
      else if (isalpha(*arr[p]) && strlen(arr[p]) ==1){
        //printf("%s is a letter\n", arr[p]);
        letters[iter2] = *arr[p];
        myPoint.connectingPoints[iter2] = letters[iter2];
        iter2++;
        //printf("letter\n");
      }
      //if its a number
      else if (isdigit(*arr[p])){
        //printf("%s is a number\n", arr[p]);
        val[iter3] = atoi(arr[p]);
        myPoint.weights[iter3] = val [iter3];
        iter3++;
      }
  }



  printf("%s %s\n",  myPoint.items[0], myPoint.items[1]);

}


int main ()
{



    char *str[9];
    str[0] = "a = 2.b, 1.d, 3.d; 4.o; milk cheese";
    str[1] = "b = 2.a, 1.e, 2.c; water juice drinks";
    str[2] = "c = 2.b, 1.f; chips snacks";
    str[3] = "d = 1.a, 1.g; bread cereal pasta";
    str[4] = "e = 1.h, 1.b; meat chicken fish";
    str[5] = "f = 1.i, 1.c; oils sauces condiments";
    str[6] = "g = 1.j, 1.d; soup canned_goods";
    str[7] = "h = 1.k, 1.e; produce";
    str[8] = "i = 1.l, 1.f; beer";

    //char str[] = "a = 2.b, 1.d, 3.d; 4.o; milk cheese";

    int i;
    for (i=0; i<9; i++){
        makeStruct(*str);

    }

  return 0;
}
#包括
#包括
#包括
结构停止点{
整数权重[10];
字符连接点[10];
字符*项目[30];
int startBool;
};
void makeStruct(char str[]{
结构停止点myPoint;
字符*arr[30];
char*pch;
pch=strtok(str,“;=,.-”;
arr[0]=pch;
int i=0;
for(pch;pch!=NULL;i++){
pch=strtok(空,;=,.-”;
arr[i+1]=pch;
//printf(“%s\n”,arr[i]);
}
printf(“\n”);
字符[10];
整数[10];
char*字符串[10]={NULL};
int p,iter=0,iter2=0,iter3=0,val[10];
for(p=0;arr[p]!=NULL;p++){
//如果是字符串
如果(isalpha(*arr[p])&strlen(arr[p])>=2{
//printf(“%s是一个字符串\n”,arr[p]);
myPoint.items[iter]=arr[p];
iter++;
}
//如果只是一封信
否则如果(isalpha(*arr[p])&strlen(arr[p])==1){
//printf(“%s是字母\n”,arr[p]);
字母[iter2]=*arr[p];
myPoint.connectingPoints[iter2]=字母[iter2];
iter2++;
//printf(“字母\n”);
}
//如果是一个数字
否则如果(isdigit(*arr[p])){
//printf(“%s是一个数字\n”,arr[p]);
val[iter3]=atoi(arr[p]);
myPoint.weights[iter3]=val[iter3];
iter3++;
}
}
printf(“%s%s\n”,myPoint.items[0],myPoint.items[1]);
}
int main()
{
char*str[9];
str[0]=“a=2.b,1.d,3.d;4.o;牛奶奶酪”;
str[1]=“b=2.a、1.e、2.c;果汁饮料”;
str[2]=“c=2.b,1.f;薯片零食”;
str[3]=“d=1.a,1.g;面包谷物面食”;
str[4]=“e=1.h,1.b;肉鸡鱼”;
str[5]=“f=1.i,1.c;油、酱、调味品”;
str[6]=“g=1.j,1.d;汤罐头食品”;
str[7]=“h=1.k,1.e;生产”;
str[8]=“i=1.l,1.f;啤酒”;
//charstr[]=“a=2.b,1.d,3.d;4.o;牛奶奶酪”;
int i;

对于(i=0;i当您在原始代码中执行此操作时:

char str[] = "a = 2.b, 1.d, 3.d; 4.o; milk cheese";
您正在创建一个
char
数组,并使用给定字符串常量的内容对其进行初始化。这很好,因为即使不能更改字符串文本
str
也只包含该字符串文本中内容的副本

但当你这样做的时候:

char *str[9];
str[0] = "a = 2.b, 1.d, 3.d; 4.o; milk cheese";
str[1] = "b = 2.a, 1.e, 2.c; water juice drinks";
...
您正在创建一个指针数组,并为每个指针分配字符串文字的地址。因此,当您将
*str
传递给函数时,它会尝试通过
strtok
函数修改字符串文字,这是不允许的

您应该创建一个二维数组,数组中的
char
用字符串常量初始化:

char str[9][50] = {
    "a = 2.b, 1.d, 3.d; 4.o; milk cheese",
    "b = 2.a, 1.e, 2.c; water juice drinks",
    "c = 2.b, 1.f; chips snacks",
    "d = 1.a, 1.g; bread cereal pasta",
    "e = 1.h, 1.b; meat chicken fish",
    "f = 1.i, 1.c; oils sauces condiments",
    "g = 1.j, 1.d; soup canned_goods",
    "h = 1.k, 1.e; produce",
    "i = 1.l, 1.f; beer"
};
此外,循环始终在数组的第一个元素中发送:

for (i=0; i<9; i++){
    makeStruct(*str);
}
for(i=0;iTry

然后通过

 char * a = str[i];
i范围从0到\u个字符串的数量\u-1

 void makeStruct(char* str[],int number_of_strings){
       ...
    }
 char * a = str[i];