关于直接复制代码出错原因的解释:以下代码都是经过我编译通过的。如果出现问题,一可能是粘贴复制时出现错误,二可能是与你的编译器有冲突。有些代码可能写的不够好,作为反面教材就可以!
上次的内容:
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.从某个位置开始截取后面的字符
#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;
}
k.从某个字符开始截取后面的某几个字符
#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> */
/************************************************************************/
#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. */
/************************************************************************/
b.写入文件文本
#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 */
/************************************************************************/
到此结束啦,关于单双链表,考虑到还是在数据结构中仔细探讨为好。网络上也有详细的讲解。晚安啦!