前言
本文为业余学习《明解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' }");
}