有关C语言数据结构中字符串的读入问题

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define leng 10
#define NULL 0
typedef struct string
{
char *ch;
int length;
}string;
void sign(char *chars)
{
string *s;
s=(string *)malloc(leng*sizeof(string));
int i;
i=sizeof(chars);
if(i==0)
{
s->ch=NULL;s->length=0;
}
else
{
s=(string *)malloc(i*sizeof(string));
for(int j=1;j<=i;j++)
{
s->ch[j]=chars[j];
printf("%c",&s->ch [j]);
}
s->length =i;
}
}
int strlength(string *s)
{
return (s->length );
}
int strcompare(string *s,string *t)
{
for(int i=0;i<s->length &&i<t->length ;++i)
{
if(s->ch[i]!=t->ch[i]) return (s->ch [i]-t->ch [i]);
}
return (s->length -t->length );
}
string *clearstring(string *s)
{
if(s->ch)
{
free(s->ch );
s->ch =NULL;
}
s->length =0;
return (s);
}
string *concat(string *s,string *s1,string *s2)
{
int j=1;
if(s->ch ) free(s->ch );
s=(string *)malloc((s1->length +s2->length )*sizeof(string));
for(int i=1;i<=s1->length -1;i++)
{
s->ch[i]=s1->ch[i] ;
}
for(i=s1->length ;i<=(s1->length +s2->length -1);i++)
{
s->ch [i]=s2->ch [j];
j++;
}
s->length =s1->length +s2->length ;
return s;
}
string *substring(string *s,string *s1,int pos,int len)
{
if(pos<1||pos>s->length ||len<0||len>s->length -pos+1)
exit(0);
if(s->ch!=NULL ) free(s->ch );
if(len==0)
{
s1->ch =NULL;s1->length =0;
}
else
{
s1 =(string *)malloc(len*sizeof(string));
for(int j=1;j<=len-1;j++)
{
s1->ch [j]=s->ch [pos-1+j];
}
s1->length=len;
}
return s1;
}
void visit(struct string *s)
{
printf("%s",s->ch);
}
int main()
{
//char *chars;
string *s;
s=(string *)malloc(sizeof(string));
printf("输入字符串的长度:\n");
scanf("%d",&s->length);
printf("输入字符串:\n");
scanf("%s",s->ch);
printf("wokao ");
// printf("%s",*s->ch );
// printf("输入要生成的字符串:\n");
return 0;
}
就最后这个读入老是显示内存不能为written,是不是我的malloc有问题啊

显然是错误的,因为struct string里边用指针存储字符串,显然要根据字符串长度动态分配该内存,下边将字符存入未分配的内存,当然错误,而且楼主代码太乱了,一会C风格一会C++风格,所以错误不只这一块,struct看写法是一个类,但是下边调用就没必要malloc分配了,直接string str;然后存储数据,但是这里楼主没有提供构造函数,也没有析构函数,这将会导致内存泄露。建议先确定是用C语言还是C++写,然后学习一点基础的东西,这样写是不会有进步的追问

表示我学的是C,小弟初学,有很多东西还是搞不懂,多谢赐教,额,这个 C风格和C++风格有什么不同饿 那个可不可以留个QQ,以后我也可以请教一下,我的是393465987,表示我最佩服编程高手了

追答

区别比较大,至少C++很少用malloc分配内存,而且C++构造函数直接会完成内存分配任务,结束时候自动调用析构函数释放内存,C语言这些操作都要你自己完成

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-12
s->ch是一个没有初始化的指针,向里面存数据当然会显示内存不能为written,你可以考虑用一个临时数组获取输入,然后再赋值给s->ch。追问

我试了用了char型的读入然后赋给s->ch,但是还是不能为written。还有就是我已经为s开辟了空间,假如我不用指针类型是不是就可以了呢

追答

为s开辟空间只是存储s->ch这个指针及其他数据成员,但并没有为这个指针分配指向的空间,你可以在获取s->length后,为s->ch分配一块空间,s->ch = (char*)malloc(s->length+1)。必须保证输入的字符串不超过s->length,否则还会出问题。
如果不用指针,还能用什么呢?用数组,长度固定,也不太好。

求解数据结构c语言中串的问题
在C语言中处理字符串操作时,理解基础函数的用法至关重要。举例来说,如果字符串s1和m之间仅由一个'号分隔,而无空格存在,字符串长度则应为13。函数SubString(s1,8,5)的作用是从字符串s1的第8个字符开始,提取连续的5个字符,结果为"tuden"。函数index(s1,'u')则在字符串s1中搜索字符'u',若...

如何用C语言将文本文件逐行读入数据结构的链表中
CFile类的readstring可以逐行读取。

麻烦各位,我以前做了一个C语言的数据结构与算法的二项式加法,但是输入...
这个主要是语法解析了,主要是做两件事:读取输入,解析单词。处理要点有两个:1.缓冲,这个通常可以用一个字符数组或字符串指针搞定;2.判断一个单词的开始和结束:碰到单词开始标志时创建一个单词,并读取缓冲直到第一个结束标志为止。依次循环就会得到一个单词链表,要注意这里的“单词”包括运算变量、...

关于数据结构(C语言版)的两个问题
首先,定义一个字符数组`stack`和一个整型变量`top`。`stack`用于存储当前遍历到的括号,`top`表示`stack`的当前栈顶索引。接着,从字符串的第二个字符开始遍历(由于第一个字符默认为左括号),判断当前遍历到的字符:如果为左括号`(`,则将其压入`stack`中,并将`top`加一。如果为右括号`)`,...

数据结构(c语言)中,为什么输入数字程序正确,输入字母程序就运行不了呢...
char rearvex;int weight;};输入也改为scanf("%c,%c,%d",&edgeset[i].frontvex,&edgeset[i].rearvex,&edgeset[i].weight 假如你的输入是从1号点到5号点,权为400,按照你的程序就应当输入:1,5,400。这样就可以的啊。或者是从点A到点F,权为400,就应输入A,F,400,也可以的。

c语言编程中的json数据怎么读取?
在C语言编程中,读取JSON数据通常需要借助第三方库。其中,cJSON是一款非常流行的轻量级C语言JSON解析器。它专为在资源有限的嵌入式设备上运行而设计,适用于C语言编程中的JSON数据处理。cJSON能够将JSON格式的文本转换为C语言的数据结构,反之亦能将C语言的数据结构序列化为JSON文本。其简洁高效的特点使其...

C语言 在一个数组或指针里有一个算式(字符串),如何对它求值?
数据互换,比如char 与double、int互换.或 double、int与string互换等(它们互换都很繁琐).提取数字含双精度类型(尤其是表达式里提取双精度数据类型是比较繁琐的)。当然也可只提取正整数(若是含有小数则不处理该表达式)。下面是我写的一个逆波兰算法,由于代码较多发不上来(百度限制了提交),多达500行...

C语言中的问题关于scanf的输入
这个程序运行很正常啊(除了函数名有点问题,应该是CreateLinkList()吧,不是GreatLinkList),你输入了好多数据,执行的不是CreateLinkList(),而是主程序中的 while(e) { insertList(&l,q,e); q=q->next; scanf("%d",&e); \/\/ <---实际读入在这里!!! }CreateLinkList...

c语言版 数据结构问题
1.找到结构的头(H)和尾(R)2.下面是伪代码 while(H在R之前) do begin if data_at[H]!=data_at[R] then return false;\/\/肯定不对称 H<-后继;R<-前驱;end;return true;时间复杂度O(strlen(s))既为表长

求解数据结构:串的查找和替换(C语言)
int countTwo = 0; \/* 记录改后文章字符个数 *\/ char keyWords[SIZE]; \/* 查找单词 *\/ char copyWords[SIZE];\/* 替换单词 *\/ char strOne[MAXLEN]; \/* 将未改文章的所有字符储存在里面 *\/ char strTwo[MAXLEN]; \/* 将改后文章的所有字符储存在里面 *\/ FILE *fp...

相似回答
大家正在搜