看到第11章《字符串和字符串函数》,就会发现这里指针的概念变得很常用,数组指针也就是数组的元素不再是数值(字符型,整型,double型),而是地址,存放的是指向某个内存单元的地址。只要时刻记得这个,就不会出现=左值不相等的情况。
1.设计并测试一个函数,可以从输入读取n个字符(包括空格、制表符和换行符),把结果存储在一个数组中,这个数组的地址通过参数来传递。
#include <stdio.h>
#include <string.h>
#define MAX 80
void put_1(char * pr);//从输入读取n个字符把结果存储在一个数组中
int main(void)
{
char ar[MAX];
printf("你可以输入n个字符:");
put_1(ar);
puts(ar);
}
void put_1(char ar[])
{
gets(ar);//从键盘输入n个字符
}
2.修改并测试1中的函数,是的可以在n个字符后,或第一个空格、制表符、换行符后停止读取输入,由上述情况中最先被满足的哪个终止读取(不能用scanf)
#include <stdio.h>
#include <string.h>
#define MAX 80
void put_1(char * pr);//从输入读取n个字符把结果存储在一个数组中
int main(void)
{
char ar[MAX];
printf("你可以输入n个字符:");
put_1(ar);
puts(ar);
}
void put_1(char * ar)
{
while(*ar++=getchar())
{
if(*ar==' ')//等于空格
break;
else if(*ar==' ')//等于制表符
break;
else if(*ar=='\n')//等于换行符
break;
else
putchar(*ar);
}
putchar('\0');
}
3.设计并测试一个函数,其功能是读取输入行里的第一个单词到数组,并丢掉该行中其他的字符。一个单词的定义是一串字符,其中不喊空格,制表符和换行符。
#include <stdio.h>
#include <string.h>
void words(char *pr);
int main(void)
{
int cout;
int i;
char lines[81];
printf("请输入一行:");
words(lines);
cout=strlen(lines);
for(i=0;i<cout;i++)//打印该单词
putchar(lines[i]);
putchar('\n');
}
//读取输入行里的第一个单词到数组里,并丢掉该行中其他的字符
void words(char *pr)
{
int cout;
scanf("%s",pr);
return cout;
}
4.设计并测试一个函数,其功能疏搜索由函数的第一个参数指定的字符串,在其中查找由函数的滴二个参数指定的字符的第一次出现的位置。如果找到,返回指向这个字符的指针;如果没有找到,返回空字符。
#include <stdio.h>
#include <string.h>
#define LISTSIZE 5
#define STRING "astro"
char *research(char * pr[],char ch)
{
int i;
int j=0;
for(i=0;i<LISTSIZE;i++)
{ if(strcmp(*pr[i],"astro")==0)
{
printf("找到了:%s\n",pr[i]);
while(*(*(pr+i)+j)!=ch)
j++;
}
}
return 0;
}
int main(void)
{
char * list[LISTSIZE]={"astronomy","astouding",
"astrophysics","ostracize",
"asterism"};
research(list,'o');
return 0;
}
5.编写一个函数is_with()。它接受两个参数,一个是字符,另一个是字符串指针。其功能是如果字符在字符串中就返回一个非0值(真);如果字符不在字符串中,就返回0值(假)。
#include <stdio.h>
#include <string.h>
int is_within(char ,char *);
int main(void)
{
char ch='a';
char shuzu[80]="sdfhqwqadfouihuwif";
printf("能不能找到该字符%d\n",is_within(ch,shuzu));
return 0;
}
int is_within(char ch,char * pr)
{
while(*pr++!='\0')
{
if(*pr==ch)
return 1;//找到显示1
else
return 0;//找不到显示0
}
}
6。strncpy(s1,s2,n)函数从s2复制n个字符给s1,并在必要时截断s2或为其填充额外的空字符。如果s2的长度等于或大于n,目标字符串就没有标志结束的空字符。函数返回s1。
#include <stdio.h>
#include <string.h>
//复制字符串
char * my_strncpy(char *dest,char *src,int cout);
int main(void)
{
char s1[80];
char s2[80]="daasdfhiwfasd";
int len=strlen(s2);
my_strncpy(s1,s2,len);
puts(s1);//puts函数只能打印字符串
return 0;
}
char * my_strncpy(char *dest,char *src,int cout)
{
while(cout--)
*dest++=*src++;
*dest='\0';//目标字符串结尾添加空字符
return dest;
}
7.编写一个函数string_in(),它接受两个字符串指针参数。如果第二个字符串被包含在第一个字符串中,函数就返回被包含的字符串开始的地址。
#include <stdio.h>
#include <string.h>
//在主串中查找次串的开始位置
char * string_in(char * dest,char * src);
int main(void)
{
char * find;
char s1[80]="deidhadaafwef";
char s2[80]="ada";
find=string_in(s1,s2);
puts(find);
return 0;
}
char *string_in(char * dest,char * src)
{
int i=0;
for(;dest[i]!='\0';i++)
{
int temp=i;//这个变量用来记录主串的起始位置
int j=0;
while (dest[i++]==src[j++])
{
if(src[j]=='\0')
return &dest[temp];
}
i=temp;
}
return NULL;//找不到就返回空字符
}
8.编写一个函数,其功能是使输入字符串反序。
#include <stdio.h>
#include <string.h>
//反序排列
char * fanxu(char * dest,char * src,int n);
int main(void)
{
int cout;
char * pa;
char s1[80];
char s2[80]="abcdefghijklmn";
printf("原始字符串是%s.\n",s2);
cout=strlen(s2);
pa=fanxu(s1,s2,cout-1);
printf("反序后字符串是\n");
puts(pa);
return 0;
}
//反序排列
//形参是目标数组,源数组,源数组的字符个数
char * fanxu(char * dest,char * src,int n)
{
char * temp=dest;//记录目标字符串的首地址
for(;n>0;n--)
{
*dest=*(src+n);
dest++;
}
*dest='\0';
return temp;
}
9.编写一个函数。其参数为一个字符串,函数删除字符串中的空格。
#include <stdio.h>
#include <string.h>
#define SPACE ' '
char * del(char * dest,char * src,int n);
int main(void)
{
char s1[81];
char s2[81]="asd saddwq adqw1 dasjd 1.";
char * pe;
int cout;
printf("原始字符串是: %s\n",s2);
cout=strlen(s2);
pe=del(s1,s2,cout-1);
printf("删除空字符后的字符串是: ");
puts(pe);
return 0;
}
char *del(char * dest,char * src,int n)
{
char * temp=dest;//记录目标数组的首地址
for(;n>0;n--)
{
if(*src!=SPACE)
*dest++=*src++;
else
src++;
}
*dest='\0';
return temp;
}
10.编写一个程序,读取输入,直到读入了10个字符串或遇到EOF,由二者中最先被满足的那个终止读取过程。
#include<stdio.h>
#include <string.h>
#define LIM 2
#define LIMCOL 81
#define SPACE ' '
int pri_menv(void);
int pri_ori(char * dest);
int pri_asc2(char *dest);
int pri_length(char *dest);
int main(void)
{
char str[LIM][LIMCOL];
char * ptr[LIM];//ptr是用来存放地址的数组。即数组指针
char ch;
int i,j;
printf("请输入10个字符串,用回车符结束每个字符串的输入。\n");
printf("请输入第[1]个字符串:");
for(i=0;i<LIM;i++)
{
for(j=0;j<LIMCOL;j++)
{
str[i][j]=getchar();
if(str[i][j]=='\n')//碰到换行符就跳出内层循环,也即输入下一个字符
{
str[i][j]='\0';//用空字符来替换换行符,代表一个字符串完美结束
break;
}
}
ptr[i]=str[i];//把每个字符串的首地址记录在ptr的数组中
if(i!=9)
printf("请输入第[%d]个字符串:",i+2);
}
pri_menv();
pri_ori(* ptr);//注意此函数的实参
pri_length(* ptr);
return 0;
}
//显示菜单
int pri_menv(void)
{
printf("请输入你要选择的选项:\n"
"1)输出初始字符串列表\t\t2)按ASCII顺序输出字符串\n"
"3)按长度递增顺序输出字符串\t\t4)按字符串中第一个单词的长度输出字符串\n"
"5)退出\n");
return 0;
}
//输出初始字符串列表
int pri_ori(char * dest)
{
int i=0;
printf("你输入的字符串列表是:\n");
for(;i<LIM;i++)
puts(dest+i);
return 0;
}
//按长度递增顺序输出字符串
int pri_length(char *dest)
{
int i=0;
int j=1;
char * address;
printf("按长度递增顺序输出字符串:\n");
for(;i<LIM;i++)
{
for(;j<LIM;j++)
{
if(strlen(dest+i)>strlen(dest+j))//如果前一个字符串长度大于后一个字符串长度
{
address=*(dest+i);//两者的首地址互换
*(dest+i)=*(dest+j);
*(dest+j)=address;
}
}
}
for(i=0;i<LIM;i++)
puts(dest+i);
return 0;
}