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

C语言中字符串到结构的转换

C语言中字符串到结构的转换,c,arrays,struct,C,Arrays,Struct,最近,我在用C语言练习文件处理,因此我编写了一个程序,逐字符读取文件,并将输出存储为字符串(非常长)。我的文件包含由制表符分隔的各种名称,一行有3个名称,如下所示 Name1 Name2 Name3 Name4 Name5 Name6 Name7 Name8 Name9 作为我编写的函数的结果,现在我有了一个字符串[Name1 Name2 Name3 Name4 Name5 Name6..] 现在我想将这些名称存储到一个结构中。。我为它编写了以下函数 #include<stdio.h

最近,我在用C语言练习文件处理,因此我编写了一个程序,逐字符读取文件,并将输出存储为字符串(非常长)。我的文件包含由制表符分隔的各种名称,一行有3个名称,如下所示

Name1 Name2 Name3
Name4 Name5 Name6
Name7 Name8 Name9
作为我编写的函数的结果,现在我有了一个字符串[Name1 Name2 Name3 Name4 Name5 Name6..]

现在我想将这些名称存储到一个结构中。。我为它编写了以下函数

  #include<stdio.h>
  #include<stdlib.h>
  #define MAX_LENGTH 30
  struct sarray
  {
  char data[MAX_LENGTH]
  };


  char* stringtoarray(char longstring[],int totalchar,int totaldata)
  {
  int i=0,j=0;
  char che;
  struct sarray say[totaldata];
  char* resultptr;
  che=longstring[i];

  while(che!='NULL')
  {

    if(che=='\t' || che=='\n')
    {
        j++;
        i=0;
    }
    else
    {
        say[j].data[i]=che;
        i++;
    }
    che=longstring[i];
}
resultptr=&say->data;
return resultptr;

}
#包括
#包括
#定义最大长度30
结构萨雷
{
字符数据[最大长度]
};
char*stringtoarray(char longstring[],int totalchar,int totaldata)
{
int i=0,j=0;
char-che;
结构sarray say[totaldata];
char*resultptr;
che=长串[i];
while(che!=“NULL”)
{
如果(che='\t'| che=='\n')
{
j++;
i=0;
}
其他的
{
假设[j]。数据[i]=che;
i++;
}
che=长串[i];
}
resultptr=&say->data;
返回结果tr;
}
下面是函数的参数

  • longstring[]——它是字符串(逐字读取文件的输出)
  • totalchar—长字符串中的字符总数[]
  • totaldata—名称的总数 我试图从main函数调用上面的函数,但它没有显示任何结果,尽管编译期间没有错误


    任何帮助都将不胜感激

    首先,你可以阅读你想要的格式,而不是单个字符,这对你自己是一个很大的帮助:

    #包括
    #包括
    #包括
    #包括
    #定义STR(X)#X
    #定义STRINGIFY(X)STR(X)
    #定义最大令牌长度30
    #定义代币\u增长3
    typedef结构标记{
    字符数据[最大标记长度+1];
    }代币;
    内部主(空)
    {
    char const*filename=“test.txt”;
    文件*input=fopen(文件名,“r”);
    如果(!输入){
    fprintf(stderr,“无法打开\%s\”进行读取:(\n\n”,文件名);
    返回退出失败;
    }
    字符标记[最大标记长度+1];
    大小\u t令牌\u大小=0;
    大小\u t数量\u令牌=0;
    token_t*tokens=NULL;
    而(fscanf(输入,“%”字符串化(最大令牌长度)“s”,令牌)=1){
    if(num_tokens==tokens_size){
    token_t*tmp_tokens=realloc(tokens,(tokens_size+tokens_GROWTH)*sizeof(*tmp_tokens));
    如果(!tmp_令牌){
    fputs(“内存不足:(\n\n”,stderr);
    打破
    }
    代币大小+=代币增长;
    令牌=tmp_令牌;
    }
    memcpy(令牌[num_tokens++]。数据,令牌,最大令牌长度+1);
    }
    fclose(输入);
    对于(大小i=0;i
    输出:
    Token#01:“Name1”
    令牌#02:“名称2”
    令牌#03:“名称3”
    令牌#04:“名称4”
    标记#05:“名称5”
    令牌#06:“名称6”
    令牌#07:“名称7”
    令牌#08:“名称8”
    令牌#09:“名称9”
    
    您可以先阅读所需的格式,而不是单个字符,从而帮自己一个大忙:

    #包括
    #包括
    #包括
    #包括
    #定义STR(X)#X
    #定义STRINGIFY(X)STR(X)
    #定义最大令牌长度30
    #定义代币\u增长3
    typedef结构标记{
    字符数据[最大标记长度+1];
    }代币;
    内部主(空)
    {
    char const*filename=“test.txt”;
    文件*input=fopen(文件名,“r”);
    如果(!输入){
    fprintf(stderr,“无法打开\%s\”进行读取:(\n\n”,文件名);
    返回退出失败;
    }
    字符标记[最大标记长度+1];
    大小\u t令牌\u大小=0;
    大小\u t数量\u令牌=0;
    token_t*tokens=NULL;
    而(fscanf(输入,“%”字符串化(最大令牌长度)“s”,令牌)=1){
    if(num_tokens==tokens_size){
    token_t*tmp_tokens=realloc(tokens,(tokens_size+tokens_GROWTH)*sizeof(*tmp_tokens));
    如果(!tmp_令牌){
    fputs(“内存不足:(\n\n”,stderr);
    打破
    }
    代币大小+=代币增长;
    令牌=tmp_令牌;
    }
    memcpy(令牌[num_tokens++]。数据,令牌,最大令牌长度+1);
    }
    fclose(输入);
    对于(大小i=0;i
    输出:
    Token#01:“Name1”
    令牌#02:“名称2”
    令牌#03:“名称3”
    令牌#04:“名称4”
    标记#05:“名称5”
    令牌#06:“名称6”
    令牌#07:“名称7”
    令牌#08:“名称8”
    令牌#09:“名称9”
    
    您的代码有任何问题

    1/如前所述,您正在返回一个指向本地分配数据的指针。当您在func中声明本地结构/数组时,用于保存该结构的空间将在堆栈中分配,并且在离开func时“丢失”。因此,返回的指针将指向垃圾

    唯一的方法是使用malloc在堆中分配数据

    替换
    struct sarray say[totaldata];

    struct sarray *say;
    say = (struct sarray *) malloc(totaldata * sizeof(struct sarray));
    
    2/NULL不是字符。如果要测试输入字符串的结尾,请将
    while(che!=“NULL”)
    替换为
    while(che!=“0”)

    3/返回&say->data不正确。如果要获取所有信息,只需返回指向结构数组的指针(并更改func的声明)

    4/许多健全检查缺失

    5/为什么func(totalchar)中有一个未使用的参数


    6/您应该重新考虑您的算法,例如,如前所述使用scanf。

    您的代码有任何问题

    1/如前所述,您正在返回一个指向本地分配数据的指针。当您在func中声明本地结构/数组时,用于保存该结构的空间将在堆栈中分配,并且在离开func时“丢失”。因此,返回的指针将指向垃圾

    唯一的方法是使用malloc在堆中分配数据

    替换
    struct sarray say[totaldata];

    struct sarray *say;
    say = (struct sarray *) malloc(totaldata * sizeof(struct sarray));