关于直接复制代码出错原因的解释:以下代码都是经过我编译通过的。如果出现问题,一可能是粘贴复制时出现错误,二可能是与你的编译器有冲突。有些代码可能写的不够好,作为反面教材就可以!
上次的内容:
1.指针的定义
2. 指针与一维数组的关系
3. 指针与二维数组的关系
4. 指针数组与数组指针
5. 指针函数与函数指针
6.字符串的处理
a.遍历每个字符charAt
b.计算字符串的长度
c.求某个字符在字符串的第一次出现的位置
d.求某个字符在字符串的最后一次出现的位置
e.统计某个字符的个数
f.比较两个字符串的大小
下面继续:
g.连接两个字符串
#include <STDIO.H>
char* concat(char* str1,char* str2);
int main()
{
char str1[7]="Hello,";
char str2[7]="World!";
char *s=concat(str1,str2);
for (int i=0;i<13;i++)
{
printf("%c",*s++);
}
getchar();
return 0;
}
char* concat(char* str1,char* str2)
{
char* str=str1;
while(*str1++!='\0')
{
;
}
while((*str1++=*str2++)!='\0')
{ ;
}
*str1='\0';
return str;
}
h.从某个字符截取
#include <STDIO.H> char *subString(char *str,char ch); int main() { char *str="HelloWorld!"; char *s=subString(str,'l'); for (int i=0;i<10;i++) { printf("%c",*s++); } return 0; } char *subString(char *str,char ch) { int i=firstindexof(str,ch);//用到了第一次出现的位置 int len=length(str);//用到了求字符串长度 char *strs=str+i; return strs; }
j.从某个位置开始截取后面的字符
k.从某个字符开始截取后面的某几个字符#include <STDIO.H> char *subString(char *str,int place); int main() { char *str="HelloWorld!"; char *s=subString(str,2); for (int i=0;i<10;i++) { printf("%c",*s++); } return 0; } char *subString(char *str,int place) { int len=length(str);//用到了求字符串长度 char *strs=str+place; return strs; }
#include <STDIO.H> char *subString(char *str,int start,int end); int main() { char *str="HelloWorld!"; char *s=subString(str,3,6); printf("%d",length(s)); return 0; } char *subString(char *str,int start,int end) { if (end<start) { return "input invalid!"; } int len=length(str);//用到了求字符串长度 char *strs=str+start; char *strs2=str+end+1; char *strs3=strs; while(*strs++!='\0' && *strs2++!='\0') {
; } return strs; }
7. 指针与结构体
指针与结构体也有两种,一是结构体指针,另一种是指针结构体。所谓结构体指针,是指结构体里的类型是由指针定义的。指针可以访问该类型的值所在的地址。而指针结构体,则是可以通过指针访问该结构体的位置。然后再去访问该结构体的变量。
实例:
#include <STDIO.H> struct Date { int year; int month; int day; }; struct PERSON { char *name; int age; struct Date *date; }; int main() { struct Date dates={2012,12,12}; struct Date* date1=&dates; struct PERSON person1={"songbird",12,date1}; printf("%s\n",person1.name);//结构体指针的引用用”.” printf("%d\n",person1.date->year);指针结构体的引用用”->” return 0; }
结构体很像我们学java或者c++等面向对象的类。或者说更像是一个类的构造器。
基于此,可以尝试着写一个C语言的类。
#include <STDIO.H> //继承 struct FatherAnimal { char *name; double weight; }; struct SonDog { int legs; char *area; struct FatherAnimal *fatherAnimal; }; //set与get方法 void setName(struct FatherAnimal *animal,char *animalname); char *getName(struct FatherAnimal *animal); void setWeight(struct FatherAnimal *animal,double animalweight); double getWeight(struct FatherAnimal *animal); void setLeg(struct SonDog *sondog,int doglegs); int getLeg(struct SonDog *sondog); void setArea(struct SonDog *sondog,char* dogarea); char *getArea(struct SonDog *sondog); int main() { struct FatherAnimal animal; struct FatherAnimal *animals=&animal; struct SonDog sondog; struct SonDog *sondogs=&sondog; setName(animals,"Hello"); setWeight(animals,22.3); setLeg(sondogs,4); setArea(sondogs,"Asian"); char *name=getName(animals); double weight=getWeight(animals); int legs=getLeg(sondogs); char *area=getArea(sondogs); struct FatherAnimal an={name,weight}; struct FatherAnimal *ans=&an; struct SonDog son={legs,area,ans}; printf("%s\n",son.fatherAnimal->name); printf("%.2lf\n",son.fatherAnimal->weight); printf("%s\n",son.area); printf("%d\n",sondog.legs); return 0; } void setName(struct FatherAnimal *animal,char *animalname) { animal->name=animalname; } char *getName(struct FatherAnimal *animal){return animal->name;} void setWeight(struct FatherAnimal *animal,double animlweight) { animal->weight=animlweight; } double getWeight(struct FatherAnimal *animal){return animal->weight;} void setLeg(struct SonDog *sondog,int doglegs) { sondog->legs=doglegs; } int getLeg(struct SonDog *sondog){return sondog->legs;} void setArea(struct SonDog *sondog,char* dogarea) { sondog->area=dogarea; } char *getArea(struct SonDog *sondog){return sondog->area;}
8.指针与文件
a.读取文件文本
#include <STDIO.H> #include <STDLIB.H> #include <MALLOC.H> int main() { //行读取 FILE *afile;//*的作用是访问到afile这个地址,然后读取 afile=fopen("E:\\my.txt","r");//afile为文件的地址 char *str=(char *)malloc(10);//内存分配 if (afile==NULL)//文件不存在检测 { printf("Can`t found the file!\n"); } while(!feof(afile))//是否读取到末尾判断 { fscanf(afile,"%s",str);//读取文件内容 printf("%s\n",str);//输出到控制台 } fclose(afile);//关闭文件 return 0; } /************************************************************************/ /* E:\\my.txt的内容: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>mytest</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>Hello.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <filter> <filter-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> */ /************************************************************************/
b.写入文件文本#include <STDIO.H> int main() { //字符读取 FILE *afile;//*的作用是访问到afile这个地址,然后读取 afile=fopen("E:\\xiao.txt","r");//afile为文件的地址 char c; if (afile==NULL)//文件不存在检测 { printf("Can`t found the file!\n"); } while(!feof(afile))//是否读取到末尾判断 { c=fgetc(afile);//读取文件内容 printf("%c\n",c);//输出到控制台 } fclose(afile);//关闭文件 return 0; } /************************************************************************/ /* E:\\xiao.txt的内容: I am bad and that's good. I will never be good and that's not bad. There is no one I would rather be than me. */ /************************************************************************/
#include <STDIO.H> int main() { //字符写入 FILE *afile;//*的作用是访问到afile这个地址,然后读取 afile=fopen("E:\\hello.txt","w+");//afile为文件的地址,无文件创建文件 char c='0'; while(c!='1') { scanf("%c",&c); fputc(c,afile); } fclose(afile);//关闭文件 return 0; } /************************************************************************/ /* 创建的E:\\hello.txt的内容: the early bird 1 */ /************************************************************************/
#include <STDIO.H> #include <MALLOC.H> char strValue(char *str); int main() { //字符串写入 FILE *afile;//*的作用是访问到afile这个地址,然后读取 afile=fopen("E:\\hello.txt","w+");//afile为文件的地址,无文件创建文件 char *c=(char *)malloc(4); printf("quit for quit!\n"); while(true) { scanf("%s",c); if (strValue(c)=='q') { break; } fputs(c,afile); } fclose(afile);//关闭文件 return 0; } char strValue(char *str) { return *str; } /************************************************************************/ /* 创建的E:\\hello.txt的内容: the early bird */ /************************************************************************/
到此结束啦,关于单双链表,考虑到还是在数据结构中仔细探讨为好。网络上也有详细的讲解。晚安啦!