一、一维字符数组
【1】数组名的含义
数组名表示数组中首元素的地址,不能更改
【2】C中字符串的处理逻辑
C语言中没有字符串类型,所以字符串用字符数组储存,为了区分,字符串后面有看不见的‘\0’作为结束的标志
例子:
终端输入一个字符串,求字符串中大写字母和小写字母的个数。
#include<myhead.h>
int main(int argc, const char *argv[])
{
//设置数组大小
char arr[100];
int i=0,j;
int a=0,b=0;
//输入字符串赋值给字符数组
scanf("%s",&arr[i]);
do
{
if (arr[i]=='\0')
{
break;
}
else if(arr[i]>='a'&&arr[i]<='z')
{
a++;
}
else if (arr[i]>='A'&&arr[i]<='Z')
{
b++;
}
i++;
} while (i<100);
printf("小写字母%d个,大写字母%d个\n",a,b);
return 0;
}
【3】字符串的输入输出函数
i)gets
函数原型:
char *gets(char *s);
使用:
gets(字符串的首地址); //从终端获取字符串
使用gets函数获取会报警告,因为gets不会做合理性检查(可能数组不能容纳下字符串也会写入)
ii)puts
函数原型:
int puts(const char *s);
使用:
puts(字符串的首地址);
处理逻辑:
从字符串的首地址开始,一直向后输出,直到遇到'\0'结束
示例代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{
char arr[100];
gets(arr);
int i;
int b=0;
for (i=0; arr[i]!='\0'; i++)
{
//下标为i的元素是空格
if(arr[i]==' ')
{
b++;//空格自增
}
}
printf("空格数%d个\n",b);
return 0;
}
二、函数
i)strlen
功能:求字符串的真实长度(不包括'\0')
函数原型:
size_t strlen(const char *s);
使用:
strlen(字符串首地址)
功能:求字符串不包含'\0'的真实长度
ii)strcpy
函数原型:
char *strcpy(char *dest, const char *src);
使用
strcpy(目标字符串首地址, 源字符串首地址);
将源字符串中的内容,拷贝给目标字符串中,需要保证dest字符串的空间足够大,来接受拷贝的结果
iii)strcat
函数原型:
函数原型:
char *strcat(char *dest, const char *src);
使用:
strcat(目标字符串的首地址, 源字符串的首地址)
功能:将src字符串拼接到dest字符串后面
dest目标字符串必须足够长,接收拼接后的结果
iv)strcmp
字符串比较函数,C中不支持字符串的比较,需要用到strcmp函数
函数原型:
int strcmp(const char *s1, const char *s2);
使用:
strcmp(字符串s1的首地址, 字符串s2的首地址);
功能:比较s1和s2的大小,返回ASCII码的差值
执行逻辑:
比较字符串s1和s2中相同位置的每一个字符,如果字符相同继续向下一个位置比较,如果不同直接返回s1中字符-s2中字符的差值,结束函数(遇到不同字符就结束)
v)bzero
函数原型:
void bzero(void *s, size_t n);
使用:
bzero(&a,2);
功能:
内存置0,从首地址开始置n个字节的0
vi)memset
函数原型:
void *memset(void *s, int c, size_t n);
使用
memset(&a,90,3);
功能:
把从s地址开始的n个Byte的空间置为c
作业:
求二维数组中元素最大值的行标和列标,并输出最大值
#include<myhead.h>
int main(int argc, const char *argv[])
{
int a[2][3]={1,3,5,7,9,2};
int i,j;
int max=a[0][0],b=0,c=0;
for (i=0; i<2; i++)
{
for (j=0; j<3; j++)
{
if(a[i][j]>max)
{
max=a[i][j];
b=i;
c=j;
}
}
}
printf("最大值的行标为%d,列标为%d\n",b,c);
printf("最大值为:%d\n",a[b][c]);
printf("\n");
return 0;
}
运行结果:
终端输入一个数,输出该数的二进制
#include<myhead.h>
int main(int argc, const char *argv[])
{
int arr[32]={};
int i,j;
int a=0;
printf("请输入一个数:");
scanf("%d",&i);
if(i==0)
{
printf("0的二进制数是:0");
}
while(i!=0)
{
arr[a]=i%2;
i=i/2;
a++;
}
for (j=a-1; j>=0;j-- )
{
printf("%d",arr[j]);
}
printf("\n");
return 0;
}
运行结果:
自己实现strcpy、strlen、strcat、strcmp
strcpy:
#include<myhead.h>
int main(int argc, const char *argv[])
{
char a[100]="qqqqqqqq";
char b[]="hello";
puts(a);
int i=0;
while(b[i])
{
a[i]=b[i];
i++;
}
puts(a);
return 0;
}
strcat:
#include<myhead.h>
int main(int argc, const char *argv[])
{
char a[100]="hello ";
char b[]="world";
puts(a);
int i=0,j=0;
//strcat(a,b);
while(a[i])
i++;
while (b[j])
{
a[i+j]=b[j];
j++;
}
a[i+j]=b[j];
puts(a);
return 0;
}
strcmp:
#include<myhead.h>
int main(int argc, const char *argv[])
{
char a[]="hello";
char b[]="he";
int len = strlen(a);
int i=0;
int c=0;
while(a[i])
{
if (a[i]!=b[i])
{
c=a[i]-b[i];
break;
}
i++;
}
printf("%d\n",c);
return 0;
}
strlen:
#include <myhead.h>
int main(int argc, const char *argv[])
{
char str[100]=""; //不完全初始化,都是'\0'
gets(str);
int i = 0;
while(str[i])
{
i++;
}
printf("字符串的长度为%d\n",i);
return 0;
}
终端输入一个带空格的字符串,输出有多少个单词
__hello_i_p_ 3
__h_i 2
h_o 2
ho 1
#include<myhead.h>
int main(int argc, const char *argv[])
{
char str[1000];
printf("请输入一个字符串: ");
gets(str); // 安全读取整行(包括空格)
int a = 0;
int b = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] != ' ' && str[i] != '\n' && !b)
{ // 排除换行符
a++;
b = 1;
} else if (str[i] == ' ' || str[i] == '\n') {
b = 0;
}
}
printf("单词数量: %d\n", a);
return 0;
}
运行结果:
实现字符串的逆置
int main(int argc, const char *argv[])
{
char arr1[100]="";
printf("输入一串字符串:");
gets(arr1);
int len=strlen(arr1);
int i,j;
for(i=0;i<len/2;i++)
{
j=arr1[i];
arr1[i]=arr1[len-1-i];
arr1[len-1-i]=j;
}
printf("%s\n",arr1);
return 0;
}
运行结果:
