一、字符串怎么表示
用字符指针 char * str
用字符数组 char str[N]
二、字符串数组怎么表示
char * S[N]
char S[N][M]
三、我遇到的问题
问题一
在结构体中(比如Student结构体)有一项char * name的内容项,在使用的过程中涉及此内容时候会有Access Violation报错
解决:我遇到此类问题一般由以下两种原因引起
1.使用结构体指针变量时候没有为该结构体指针变量malloc(只要是指针就必须malloc才能用,若是结构体变量则不需要)
2.结构体指针malloc后,其中的char * S[N]仍然需要被malloc,否则不能为之赋值或进行其他操作
问题二
在字符串数组中,如果涉及到排序问题,那么我们不管用哪种排序方法都难免涉及到两个字符串交换位置的问题,那么针对不同种形式表示的字符串,应当有不同种的方法
(1)如果字符串是用char数组表示的那么我们可以通过下面的方法:
char temp[n];
strcpy(temp,s[1]);
strcmp(s[1],s[2]);
strcmp(s[2],s[1]);
//假设之前我们已经声明了一个 char [N][M]的字符串数组,现在要对s[1]和s[2]交换
(2)如果字符串是用char * s 指针来表示的,那么我们不能再使用strcpy函数
因为strcpy(char * dst,char * src)函数中dst只能是字符数组或者是动态分配的指针(即用malloc过的指针),本题中的s[1] s[2]并不符合。可以同直接将指针交换的方法
char * temp;
temp=s[1];
s[1]=s[2];
s[2]=temp;
问题三、基于问题一,对其中的指针进行malloc时候出现了无法从 void* 转换到xxx类型的问题
因为用结构体指针需要对结构体指针malloc,所以我干脆用结构体变量好啦!
比如说
typedef struct{
char * name;
}Student;
Student Stu[N];
刚刚既然说了需要给里面的指针malloc,那我干脆给这个结构体变量都动态分配空间好啦!
于是想给第一个学生写下了浓墨重彩的一笔叫做:Stu[1]=(Student)malloc(sizeof(Student));
但是编译器报错了,他说我不能把(void *)转为Student类型!纳尼?哪儿来的void*??
原理是这样的:因为分配内存后缺省内存类型是void *,所有的malloc分配地址的时候都需要强制类型转换,但是void*它也是个堂堂正正的指针啊,怎么能转成个Student类型的结构体变量类型呢!?
那我怎么搞?
我们只要把里面的name分配了空间就可以,即Stu[1].name=(char*)malloc(sizeof(char)*5);
综述、以上是最近遇到的一些问题。由于字符串可以用char *型指针表示,而指针经常会因为没有malloc而产生access violation的问题,一般可以通过调试找到