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语言的同学提供一点帮助
(请勿转载)