C语言经典案例——第六章 字符串

本篇提供了关于C语言程序设计中字符串部分的经典案例,可供C语言的初学者们进行一个学习和编译练习。

/*Case 1
字符串替换
实现字符串“Good morning!”到“Good evening!”的转换*/

char* MyReplace(char* s1, char* s2, int pos) {   //自定义的替换函数
	int i, j;
	i = 0;
	for ( j = pos; s1[j]!='\0';j++)     //从原字符串指定位置开始替换
	{
		if (s2[i]!='\0')                //判断有没有遇到结束符
		{
			s1[j] = s2[i];              //将替换内容逐个替换
			i++;
		}
		else
		{
			break;
		}
	}
	return s1;
}
int main() {
	char str1[50] = "Good morning!";
	char str2[50] = "evening";
	int position;                          //定义整型变量存储要替换的位置
	printf("替换前的字符串:\n%s\n", str1);
	printf("请输入你想替换的位置:\n");
	scanf("%d", &position);
	MyReplace(str1, str2, position);       //调用替换函数
	printf("替换后的字符串:\n%s\n", str1);
	return 0;
}

/*Case 2
删除字符串中的字串
从键盘输入一个字符串,输入要删除的字符串起始位置及长度,然后输出删除后的字符串*/

char* del(char s[], int pos, int len) {
    int i;
    for ( i = pos+len-1; s[i]!='\0'; i++,pos++)
    {
        //i的初值为指定删除部分后面的第一个字符
        s[pos - 1] = s[i];
    }
    s[pos - 1] = '\0';
    return s;
}
int main() {
    char str[50];
    int position;
    int length;
    printf("请输入字符串:\n");
    gets(str);
    printf("请输入要删除的位置:\n");
    scanf("%d", &position);
    printf("请输入要删除的长度:\n");
    scanf("%d", &length);
    del(str, position, length);
    printf("删除后的字符串为:\n%s\n",str);
    return 0;
}

 /*Case 3
到底有多少单词
首先在屏幕上输入一句话,每个单词之间用空格隔开,要求第一个字符和最后一个字符都不能为空格;
然后统计出这句话的单词数量,并把结果输出到屏幕上*/

int main() {
	char str[50];                   //定义保存字符串的数组
	int i, count = 1;               //count表示单词的个数
	char blank;                     //表示空格
	printf("请输入字符串:\n");     
	gets(str);                      //输入字符串
	if (str[0]=='\0')               //判断如果字符串为空的情况
	{
		printf("No Words!\n");
	}
	else
	{
		for ( i = 0; str[i] != '\0'; i++)  //循环判断每一个字符
		{
			blank = str[i];                //得到数组中的字符元素
			if (blank==' ')                //判断是不是空格
			{
				count++;                   //如果是则加一
			}
		}
		printf("There are %d words in this sentence.\n", count);
	}
	return 0;
}

 /*Case 4
在指定位置插入字符*/

void insert(char s[], char t, int i) {
	char str[100];
	strncpy(str, s, i);        //将s数组中前i个字符复制到str中
	str[i] = t;                //把t放到str后边
	str[i + 1] = '\0';         //结束str
	strcat(str, (s + i));      //将剩余的字符串连接到str
	strcpy(s, str);            //将str复制到s中
}
int main() {
	char str[100], c;
	int position;
	printf("请输入字符串:\n");
	gets(str);
	printf("请输入要插入的字符:\n");
	scanf("%c", &c);
	printf("请输入要插入的位置:\n");
	scanf("%d", &position);
	insert(str, c, position);
	puts(str);
	return 0;
}

 /*Case 5
禁用strcpy()
不使用strcpy()函数,把字符串1中的内容复制到字符串2中*/

int main() {
	char s1[50], s2[50];
	int i = 0;
	printf("请输入字符串:\n");
	gets(s1);
	while (s1[i]!='\0')
	{
		s2[i] = s1[i];
		i++;
	}
	s2[i] = '\0';
	printf("复制的结果是:\n");
	puts(s2);
	return 0;
}

 /*Case 6
那些字符串
对“c language”、“hello world”、“itcast”、“strcmp”和“just do it”
这五个字符串按照首字母大小进行由小到大的排序,并将结果输出*/

void sort(char* strings[], int n) {
	char* temp;
	int i, j;
	//选择排序法
	for ( i = 0; i < n-1; i++)
	{
		for ( j = i+1; j < n; j++)
		{
			if (strcmp(strings[i],strings[j])>0)
			{
				temp = strings[i];
				strings[i] = strings[j];
				strings[j] = temp;
			}
		}

	}
}
int main() {
	int n = 5;
	int i;
	char* strings[] = { "c language","hello world","itcast","strcmp","just do it"};
	sort(strings, n);
	for ( i = 0; i < n; i++)
	{
		printf("%s\n", strings[i]);
	}
	return 0;
}

 /*Case 7
你中有我
字符串1和字符串2,查找在字符串1中是否有字符串2*/

int main() {
    char str1[30], str2[30], * p;
    printf("请输入字符串1:\n");
    gets(str1);
    printf("请输入字符串2:\n");
    gets(str2);
    p = strstr(str1, str2);    //确定str1中是否包含str2
    if (p)
    {
        printf("str1包含str2!\n");
    }
    else
    {
        printf("str1不包含str2!\n");
    }
    return 0;
}

 /*Case 8
密码疑云
设计一种算法,把电文明文加密之后变成密文,利用解密函数才能对密文解密,显示出明文内容*/

int main() {
    int flag = 1;
    int i;
    int count = 0;
    char MingWen[128] = { '\0' };
    char MiWen[128] = { '\0' };
    while (1)
    {
        if (flag == 1)
        {
            printf("请输入要加密的明文:");
            scanf("%s", &MingWen);
            count = strlen(MingWen);
            for (i = 0; i < count; i++)
            {
                MiWen[i] = MingWen[i] + 3;
            }
            MiWen[i] = '\0';
            //输出密文信息
            printf("加密后的密文:%s\n", MiWen);
        }
        else if (flag==2)
        {
            printf("请输入要解密的密文:");
            scanf("%s", &MiWen);
            count = strlen(MiWen);
            for (i = 0; i < count; i++)
            {
                MingWen[i] = MiWen[i]-3;
            }
            MingWen[i] = '\0';
            //输出明文信息
            printf("解密后的明文:%s\n", MingWen);
        }
        else if(flag==3)
        {
            break;
        }
        else
        {
            printf("命令错误,请重新输入!\n");
        }
        printf("#################\n");
        printf("#   1.加密明文  #\n");
        printf("#   2.解密密文  #\n");
        printf("#   3.退出程序  #\n");
        printf("#################\n");
        scanf("%d", &flag);
    }
    return 0;
}

 /*Case 9
回文字符串
从键盘上输入字符串,判断其是否为回文字符串*/

方法一

//方法1
int fun(int low, int high, char* str, int length) {
    if (length==0||length==1)
    {
        return 1;
    }
    if (str[low]!=str[high])
    {
        return 0;
    }
    return fun(low + 1, high - 1, str, length - 2);
}
int main() {
    int length = 0;
    char ch, str[50];
    printf("请输入一个字符串:\n");
    while ((ch=getchar())!='\n')
    {
        str[length] = ch;
        length++;
    }
    if (fun(0,length-1,str,length)==1)
    {
        printf("YES!\n");
    }
    else
    {
        printf("NO!\n");
    }
    return 0;
}

 方法二

//方法二
int fun(char* begin, char* end) {
	if (begin==NULL||end==NULL||begin>end)
	{
		return 0;
	}
	while (begin<end)
	{
		if (*begin!=*end)
		{
			return 0;
		}
		begin++;
		end--;
	}
	return 1;
}
int main() {
	int length = 0;
	char ch, str[50];
	char* begin = NULL;
	char* end = NULL;
	printf("请输入一个字符串:\n");
	while ((ch=getchar())!='\n')
	{
		str[length] = ch;
		length++;
	}
	begin = str;
	end = &str[length - 1];
	if (fun(begin,end)==1)
	{
		printf("YES!\n");
	}
	else
	{
		printf("NO!\n");
	}
	return 0;
}

 本篇的所有代码是在VS编译环境下操作的,如有错误,望大家指正!!! 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐太阳的星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值