C语言字符串数组【从0到1】

C语言字符串数组

一.概念引入

  • 区分: ‘0’表字符
    0 int型
    字符串变量 在字符数组末尾自动生成’\0’
    字符数组长度 (字符数+1)
    可利用数组进行遍历

字符串的输入和输出

输入:

  • scanf读到一个单词(到空格,Tab,回车为止 )
#include <stdio.h>

int main()
{
	char a[10];
	scanf("%9s",&a);
	printf("%9s",a);
}

tips:安全问题 防止越界
在%和s之间加数字规定最多输出字符数(不包括’\0’

  • gets(str) 遇回车结束并自动+‘\0’

输出:

  • printf(“%s”,str) 不换行
  • puts(str) 把’\0’转换为回车 换行

字符串函数

头文件 #include <string.h>

  • strlen–字符串长度

[sizeof]所占内存长度

#include <stdio.h>
#include <string.h>

int main()
{
	char a[]="helloworld";
	printf("srlen=%lu",strlen(a));
	printf("sizeof=%lu",sizeof(a));
}
  • strcmp–比较两字符串

0:s1==s2
1:s1>s2
-1:s1<s2
ASCII码 特例:大小写32 ‘0’/’ ’

#include <stdio.h>
#include <string.h>

int main()
{
	char a[]="abc";
	char b[]="abcd";
	printf("%d",strcmp(a,b));
}

输出-1

strncmp 只比较前n个数

  • strcpy
#include <stdio.h>
#include <string.h>

int main()
{
	char a[]="abc";
	char b[5];
	strcpy(b,a);
	printf("%s",b);
}

输出abc

  • strcat–连接字符串
int main()
{
	char a[]="abc";
	char b[]="def";
	printf("%s",strcat(a,b));
}

输出abcdef
tips:安全问题 为防止越界
使用
strncpy
strncat

  • 字符串中找字符
    strchr(从左开始寻找)
    strrchr(从右开始寻找)
    如果在字符串 str 中找到字符 c,则函数返回指向该字符的指针,如果未找到该字符则返回 NULL
#include <stdio.h>
#include <string.h>

int main ()
{
   const char str[] = "document";
   const char ch = 'o';
   char *ptr;

   ptr = strchr(str, ch);

    if (ptr != NULL) {
        printf("字符 'o' 出现的位置为 %ld。\n", ptr - str + 1);
        printf("%c之后的字符串是%s", ch, ptr);
    } else {
        printf("没有找到字符 'o' 。\n");
    }
   return 0;
}
  • 字符大小写转换函数
    strupr(ch) 小写 换为 大写
    strlwr(str) 大写 换为 小写

二.例题部分

字符的分类统计

输入由小写字母构成的字符串(长度小于100),统计大于,等于,小于’d’的字符串

#include <stdio.h>
#include <string.h>

int main()
{
	char m[100];
	int i,a=0,b=0,c=0;
	gets(m);
	for(i=0;m[i]!='\0';i++)
	{
		if(m[i]>'d')
		a++;
		else if(m[i]=='d')
		b++;
		else
		c++;
	}
	printf("%d %d %d",a,b,c);
	return 0;
}

字符转换

输入由字母,数字,空格组成的字符串(长度<20)
完成编码,译码任务
编码:大写转小写,数字+3(超范围重新循环),其他字符不变
译码:小写转大写,数字(奇数为0,偶数为1),其他字符不变

#include <stdio.h>
#include <string.h>

int main()
{
	char m[20],a[20],b[20];
	gets(m);
	int i,l,c;
	l=strlen(m);
	for(i=0;i<l;i++)
	{
		if(m[i]>='A'&&m[i]<='Z')
		a[i]=m[i]-'A'+'a';//大写转小写
		else if(m[i]>='0'&&m[i]<='9')
		{
			c=m[i]-'0'+3;//c在此处为数字 
			if(c>9)
			a[i]=c-10+'0';//超出范围 
			else
			a[i]=c+'0';
		}
		else 
		a[i]=m[i];
		if(m[i]>'a'&&m[i]<'z')
		b[i]=m[i]-'a'+'A';
		else if(m[i]>='0'&&m[i]<='9')
		{
			c=m[i]-'0';//把字符串中的数转换为数字再进行计算
			if(c%2==0) 
			b[i]='0';
			else
			b[i]='1'; 
		}
		else
		b[i]='*';
	}
	a[i]='\0';
	b[i]='\0';//防止越界
	puts(a);
	puts(b);
	return 0; 
}

字符的插入

在指定位置M处插入字符(和数组编号一致)`

#include <stdio.h>
#include <string.h>

int main()
{
	char m[20];
	gets(m);
	char n;
	int M,i,l;
	scanf("%d %c",&M,&n);
	l=strlen(m);
	for(i=l;i>=M;i--)//逆序,方便后移
	{
		if(i==M)
		m[i]=n;
		else
		m[i]=m[i-1];
	}
	m[l+1]='\0';//防止溢出
	puts(m);
	return 0; 
}

字符的删除

删除字符串中与指定字符相同的字符

#include <stdio.h>
#include <string.h>

int main()
{
	char m[20],n[20];
	gets(m);
	char a;
	scanf("%c",&a);
	int i=0,j=0;
	do
	{
		if(m[i]!=a)
		{
			n[j]=m[i];//借助另外数组
			j++; 
		}
		i++;
	}while(m[i]!='\0');
	n[j]='\0';
	puts(n);
	return 0;
}

字符串的排序

字母+一个数字字符构成字符串(l<20)
大写-升序 小写-降序

#include <stdio.h>
#include <string.h>

int main()
{
	char m[20],big[20],sml[20];
	char c;
	gets(m);
	int i,j,a=0,b=0,d;
	for(i=0;m[i]!='\0';i++)
	{
		if(m[i]>='A'&&m[i]<'Z')
		big[a++]=m[i];//存储大写字母 
		else if(m[i]>='a'&&m[i]<='z')
		sml[b++]=m[i];//存储小写字母 
		else
		c=m[i];//存储数字 
	}
	big[a]='\0';//注意前面a是先赋值再自加 
	sml[a]='\0';
	for(i=0;i<a-1;i++)//注意i的范围,防止越界 
	{
		for(j=i+1;j<a;j++)
		{
			if(big[i]>big[j])
			{
				d=big[i];
				big[i]=big[j];
				big[j]=d;
			}
		} //正向排序 
	}
	for(i=0;i<b-1;i++)
	{
		for(j=0;j<b;j++)
		{
			if(sml[j]<sml[j+1])
			{
				d=sml[j];
				sml[j]=sml[j+1];
				sml[j+1]=d;
			}
		}
	}//反向排序
	printf("%s%c%s",big,c,sml); 
	return 0;
}
tips:

未定义内容的数组
末尾加终止符!‘\0’

附:
本文基础部分来自翁恺C语言的学习笔记
例题来自学校老师上课内容
个人为巩固所学而写
希望能同时为初学C语言的同学提供一点帮助
(请勿转载)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值