明解C语言入门篇_第9章_字符串的基本知识

前言

本文为业余学习《明解C语言入门篇》的记录,包含代码清单和练习题。
开始学习时间:2022年8月21日
+++++++++++++++++++++++++++++++
第1章 初识C语言
第2章 运算和数据类型
第3章 分支结构程序
第4章 程序的循环控制
第5章 数组
第6章 函数
第7章 基本数据类型
第8章 动手编写各种程序吧
第9章 字符串的基本知识
第10章 指针
第11章 字符串和指针
第12章 结构体
第13章 文件处理
+++++++++++++++++++++++++++++++

第9章、字符串的基本知识

9-1 什么是字符串

代码清单 9-1

//显示字符串字面量的长度

#include <stdio.h>

int main()
{
	printf("sizeof(\"123\")       = %u\n",	(unsigned)sizeof("123"));
	printf("sizeof(\"AB\\tC\")    = %u\n",	(unsigned)sizeof("AB\tC"));
	printf("sizeof(\"abc\\0def\") = %u\n",	(unsigned)sizeof("abc\0def"));

	return 0;
}

代码清单 9-2

//将字符串存储在数组中并显示(其1:赋值)

#include <stdio.h>

int main()
{
	char str[4];

	str[0]='A';
	str[1]='B';
	str[2]='C';
	str[3]='\0';

	printf("字符串str为\"%s\"。\n",str);

	return 0;
}

代码清单 9-3

//将字符串存储在数组中并显示(其2:初始化)

#include <stdio.h>

int main()
{
	char str[]="ABC";

	printf("字符串str为\"%s\"。\n",str);

	return 0;
}

练习 9-1

//必定代码清单9-3的声明
#include <stdio.h>

int main()
{
	char str[]="ABC\0DEF";

	printf("字符串str为\"%s\"。\n",str);

	return 0;
}

代码清单 9-4

//询问名字并显示问候语(读取字符串)

#include <stdio.h>

int main()
{
	char name[48];

	printf("请输入你的名字:");
	scanf("%s",name);

	printf("你好,%s先生/女士!!\n",name);

	return 0;
}

练习 9-2

//将初始化赋值的字符串s变成空字符串

#include <stdio.h>

int main()
{
	char s[]="ABC";

	s[0]='\0';

	printf("字符串s为%s。\n",s);

	return 0;
}

代码清单 9-5

//格式化字符串"12345"并显示

#include <stdio.h>

int main()
{
	char str[]="12345";

	printf("%s\n",		str);
	printf("%3s\n",		str);
	printf("%.3s\n",	str);
	printf("%8s\n",		str);
	printf("%-8s\n",	str);

	return 0;
}

9-2 字符串数组

代码清单 9-6

//字符串数组

#include <stdio.h>

int main()
{
	int i;
	char cs[][6]={"Turbo","NA","DOHC"};

	for(i=0;i<3;i++)
	{
		printf("cs[%d] = \"%s\"\n",i,cs[i]);
	}

	return 0;
}

代码清单 9-7

//读取并显示字符串数组

#include <stdio.h>

int main()
{
	int i;
	char s[3][128];

	puts("请输入三个字符串。");

	for(i=0;i<3;i++)
	{
		printf("s[%d] = ",i);
		scanf("%s",s[i]);
	}

	for(i=0;i<3;i++)
	{
		printf("s[%d] = \"%s\"\n",i,s[i]);
	}

	return 0;
}

练习 9-3

//改写代码清单9-7
//本题采用if(s[i]=="$$$$$")停止读取操作行不通,暂时没想明白,只能用了个最笨的办法。

#include <stdio.h>

#define NUMBER 5

int ISbreak(char sx[]);

int main()
{
	int i;
	int n=0;
	char s[NUMBER][128];

	for(i=0;i<NUMBER;i++)
	{
		printf("s[%d] = ",i);
		scanf("%s",s[i]);
		if(ISbreak(s[i])==5)
		{
			break;
		}
		n++;
	}

	for(i=0;i<n;i++)
	{
		printf("s[%d] = \"%s\"\n",i,s[i]);
	}

	return 0;
}

int ISbreak(char sx[])
{
	int i;
	int ns=0;

	for(i=0;i<5;i++)
	{
		if(sx[i] == '$')
		{
			ns++;
		}

	}
	return ns;
}

9-3 字符串处理

代码清单 9-8

//判断字符串的长度

#include <stdio.h>

int str_length(const char s[]);

int main()
{
	char str[128];

	printf("请输入字符串:");
	scanf("%s",str);

	printf("字符串%s的长度为%d。\n",str,str_length(str));

	return 0;
}

int str_length(const char s[])
{
	int len=0;
	
	while(s[len])
	{
		len++;
	}

	return len;
}

练习 9-4

//编写一个函数,使字符串s为空字符串

#include <stdio.h>

void null_string(char s[]);
int len_string(char s[]);

int main()
{
	char str[128];

	printf("请输入一个字符串:");
	scanf("%s",str);

	printf("字符串长度为%d。\n",len_string(str));

	null_string(str);

	printf("字符串长度为%d。\n",len_string(str));

	return 0;
}

void null_string(char s[])
{
	s[0]='\0';
}

int len_string(char s[])
{
	int len=0;

	while(s[len])
	{
		len++;
	}

	return len;
}

练习 9-5

//查询字符串中字符c的下标值

#include <stdio.h>

int str_char(const char s[],int c );

int main()
{
	char str[128];

	printf("请输入一个字符串:");
	scanf("%s",str);

	str_char(str,'c')==-1
		?printf("字符串\"%s\"不包含字符'c'。\n",str)
		:printf("字符串\"%s\"中第一个字符'c'的下标是%d。\n",str,str_char(str,'c'));
	
	return 0;
}

int str_char(const char s[],int c )
{
	int n=0;

	while(s[n++])
	{
		if(s[n]==c)
		{
			return n;
		}
	}

	return -1;
}

练习 9-6

//统计字符串s中字符c的个数

#include <stdio.h>

int str_chnum(const char s[],int c);

int main()
{
	char str[128];

	printf("请输入一个字符串:");
	scanf("%s",str);

	printf("字符串\"%s\"中字符'c'的个数为%d。\n",str,str_chnum(str,'c'));

	return 0;
}

int str_chnum(const char s[],int c)
{
	int len=0,num=0;

	while(s[len++])
	{
		if(s[len]==c)
		{
			num++;
		}
	}

	return num;
}

代码清单 9-9

//遍历字符串并显示

#include <stdio.h>

void put_string(const char s[]);

int main()
{
	char str[128];

	printf("请输入一个字符串:");
	scanf("%s",str);

	printf("你输入了");
	put_string(str);
	puts("。\n");

	return 0;
}

void put_string(const char s[])
{
	int i=0;

	while(s[i])
	{
		putchar(s[i++]);
	}
}

练习 9-7

//编写函数,使字符串s显示n次

#include <stdio.h>

void put_string(const char s[],int n);

int main()
{
	char str[128];
	int ns;

	printf("请输入一个字符串:");	scanf("%s",str);
	printf("请输入要显示的次数:");	scanf("%d",&ns);

	put_string(str,ns);

	return 0;
}

void put_string(const char s[],int n)
{
	int i;

	printf("\"");
	for(i=0;i<n;i++)
	{
		printf("%s",s);
	}
	printf("\"\n");
}

练习 9-8

//编写函数,实现字符串逆向输出

#include <stdio.h>

void put_string(const char s[]);
int str_len(const char s[]);

int main()
{
	char str[128];

	printf("请输入一个字符串:");
	scanf("%s",str);

	printf("字符串\"%s\"逆向后:",str);
	put_string(str);

	return 0;
}

void put_string(const char s[])
{
	int i;

	printf("\"");
	for(i=str_len(s)-1;i>=0;i--)
	{
		putchar(s[i]);
	}
	printf("\"\n");
}

int str_len(const char s[])
{
	int len=0;

	while(s[len])
	{
		len++;
	}

	return len;
}

代码清单 9-10

//计算字符串中的数字字符数

#include <stdio.h>

void str_dcount(const char s[],int cnt[]);

int main()
{
	int i;
	int dcnt[10]={0};
	char str[128];

	printf("请输入一个字符串:");
	scanf("%s",str);

	str_dcount(str,dcnt);

	printf("数字字符的出现次数\n");
	for(i=0;i<10;i++)
	{
		printf("'%d':%d\n",i,dcnt[i]);
	}

	return 0;
}

void str_dcount(const char s[],int cnt[])
{
	int i=0;

	while(s[i])
	{
		if(s[i]>='0' && s[i]<='9')
		{
			cnt[s[i] - '0']++;
		}
		i++;
	}
}

练习 9-9

//逆向显示字符串s的字符

#include <stdio.h>

void rev_string(char s[]);
int str_len(const char s[]);

int main()
{
	char str[128];
	int i;

	printf("请输入一个字符串:");
	scanf("%s",str);
	
	printf("字符串\"%s\"逆向后:\"",str);
	rev_string(str);
	printf("%s\"。\n",str);

	return 0;
}

void rev_string(char s[])
{
	int i;
	int n;
	int temp;

	n=str_len(s);

	for(i=0;i<n/2;i++)
	{
		temp=s[i];
		s[i]=s[n-1-i];
		s[n-1-i]=temp;
	}
}

int str_len(const char s[])
{
	int len=0;

	while(s[len])
	{
		len++;
	}

	return len;
}

代码清单 9-11

//对字符串中的英文字符进行大小写转换

#include <stdio.h>
#include <ctype.h>

void str_toupper(char s[]);
void str_tolower(char s[]);

int main()
{
	char str[128];

	printf("请输入一个字符串:");
	scanf("%s",str);

	str_toupper(str);
	printf("大写字母:%s\n",str);
	str_tolower(str);
	printf("小写字母:%s\n",str);

	return 0;
}

void str_toupper(char s[])
{
	int i=0;
	
	while(s[i])
	{
		s[i]=toupper(s[i]);
		i++;
	}
}

void str_tolower(char s[])
{
	int i=0;

	while(s[i])
	{
		s[i]=tolower(s[i]);
		i++;
	}
}

练习 9-10

//编写函数,将字符串s中的数字全部删除

#include <stdio.h>

void del_digit(char s[]);

int main()
{
	int i;
	char str[128];

	printf("请输入一个字符串:");
	scanf("%s",str);

	del_digit(str);
	printf("删除数字后:%s\n",str);

	return 0;
}

void del_digit(char s[])
{
	int i=0;
	int j=0;
	char temp[128]={0};
	
	while(s[i])
	{
		if(s[i]<'0' || s[i]>'9')
		{
			temp[j]=s[i];
			j++;
		}
		i++;
	}

	j=0;
	while(temp[j])
	{
		s[j]=temp[j];
		j++;
	}
	s[j]='\0';
}

代码清单 9-12

//显示字符串数组(函数版)

#include <stdio.h>

void put_strary(const char s[][6],int n);

int main()
{
	char cs[][6]={"Turbo","NA","BOHC"};

	put_strary(cs,3);

	return 0;
}

void put_strary(const char s[][6],int n)
{
	int i;

	for(i=0;i<n;i++)
	{
		printf("s[%d] = \"%s\"\n",i,s[i]);
	}
}

代码清单 9-13

//显示字符串数组(函数版,逐字符遍历)

#include <stdio.h>

void put_strary2(const char s[][6],int n);

int main()
{
	char cs[][6]={"Turbo","NA","BOHC"};

	put_strary2(cs,3);

	return 0;
}

void put_strary2(const char s[][6],int n)
{
	int i;

	for(i=0;i<n;i++)
	{
		int j=0;
		printf("s[%d] = \"",i);
		while(s[i][j])
		{
			putchar(s[i][j++]);
		}
		puts("\"");
	}
}

练习 9-11

//改写代码清单9_12,用对象式宏定义,遇到"$$$$$"时停止读取操作

#include <stdio.h>

#define NUM 5
#define STR_NUM 128

void put_strary(const char s[][STR_NUM],int n);
int ISbreak(char sx[]);

int main()
{
	int i;
	int nx=0;

	char cs[NUM][STR_NUM];

	for(i=0;i<NUM;i++)
	{
		printf("cs[%d]:",i);
		scanf("%s",cs[i]);
		if(ISbreak(cs[i])==5)
		{
			break;
		}
		nx++;
	}

	put_strary(cs,nx);

	return 0;
}

void put_strary(const char s[][STR_NUM],int n)
{
	int i;

	for(i=0;i<n;i++)
	{
		printf("s[%d] = \"%s\"\n",i,s[i]);
	}
}

int ISbreak(char sx[])
{
	int i;
	int ns=0;

	for(i=0;i<5;i++)
	{
		if(sx[i] == '$')
		{
			ns++;
		}

	}
	return ns;
}

练习 9-12

//编写函数,将接收到的字符串数组中存储的n个字符串的字符逆向显示

#include <stdio.h>

void rev_string(char s[][128],int n);
void rev(char s[]);
int str_len(const char s[]);

int main()
{
	int i;
	char cs[][128]={"Turbo","NA","DOHC"};

	puts("逆向前:");
	for(i=0;i<3;i++)
	{
		printf("cs[%d] = \"%s\"\n",i,cs[i]);
	}

	rev_string(cs,3);

	puts("逆向后:");
	for(i=0;i<3;i++)
	{
		printf("cs[%d] = \"%s\"\n",i,cs[i]);
	}

	return 0;
}

void rev_string(char s[][128],int n)
{
	int i;

	for(i=0;i<n;i++)
	{
		rev(s[i]);
	}
}

void rev(char s[])
{
	int n;
	int i;
	int temp;

	n=str_len(s);
	
	for(i=0;i<n/2;i++)
	{
		temp=s[i];
		s[i]=s[n-1-i];
		s[n-1-i]=temp;
	}

}

int str_len(const char s[])
{
	int len=0;
	
	while(s[len])
	{
		len++;
	}

	return len;
}

总结

summary

//遍历字符串并显示

#include <stdio.h>

#define STR_LENGTH 128

void put_string_rep(const char s[]);

int main()
{
	char s[STR_LENGTH];
	char ss[5][STR_LENGTH];
	int i;

	printf("字符串s:");
	scanf("%s",s);

	puts("请输入5个字符串。");

	for(i=0;i<5;i++)
	{
		printf("ss[%d]:",i);
		scanf("%s",ss[i]);
	}

	printf("字符串s:");
	put_string_rep(s);

	puts("字符串数组ss");
	for(i=0;i<5;i++)
	{
		printf("ss[%d]:",i);
		put_string_rep(ss[i]);
	}
}

void put_string_rep(const char s[])
{
	int i=0;

	while(s[i])
	{
		putchar(s[i++]);
	}
	printf(" {");

	i=0;
	while(s[i])
	{
		putchar(' ');
		putchar('\'');
		putchar(s[i++]);
		putchar('\'');
	}
	puts(" '\\0' }");
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值