C Primer Plus(第五版)学习(九)

看到第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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值