C语言中字符串到结构的转换
最近,我在用C语言练习文件处理,因此我编写了一个程序,逐字符读取文件,并将输出存储为字符串(非常长)。我的文件包含由制表符分隔的各种名称,一行有3个名称,如下所示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
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;
}
下面是函数的参数
任何帮助都将不胜感激 首先,你可以阅读你想要的格式,而不是单个字符,这对你自己是一个很大的帮助:
#包括
#包括
#包括
#包括
#定义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));