二维数组练习
使用二维数组实现杨辉三角
二维数组的转置(行变列,列变行)
一维字符数组
格式:存储类型 char 数组名[常量表达式]
char str[10];//存储10个字符,整体是一个字符串
字符数组:存储一个或多个字符的容器
字符串:0个或多个字符的整体(标志是'\0',不是双引号,一般字符串多是使用双引号引起来)
char str[10]="hello";
字符数组>字符串,字符数组存储字符串
数组的定义及初始化
定义
char str[10];//存储10个字符,整体是一个字符串
初始化
单字符初始化
char str[5]={'z','b','x','c','v'};//单字符的全部初始化
char str[5]={'z','x'};//单字符的部分初始化,剩余元素使用‘\0’或0填充
char str[]={'z','b','x','c','v'};//省略数组长度,默认是实际元素个数
字符串初始化
char str[5]={"abcd"};//字符串的全部初始化,当双引号引起来,计算机自动添加\0
char str[5]="abcd";//字符串的全部初始化,当双引号引起来,{}可以省略
char str[5]="ab";//字符串的部分初始化,剩余元素使用\0或0填充
char str[5]="";//字符串清0
char str[]="ab";//省略数组长度,默认是实际元素个数加一
字符串错误初始化
char str[5]="abcde";//越界
char str[5];
str[5]="abcd";//数组不支持拐弯赋值
一维字符数组的引用
单字符的引用
使用格式:
char str[]="abcd";//定义字符数组初始化
char str[]="hello";
int i;
// for(i=0;i<strlen(str);i++)
for(i=0;str[i]!='\0';i++)
{
printf("%c",str[i]);
}
return 0;
*strlen(字符数组名);//计算字符串长度,遇到\0结束
格式:
size_t strlen(const char *s);
参数:
s:字符数组变量名
字符串的整体引用
char str[10];
scanf("%s",str); //整体引用占位符需要%s -->%s:从首地址开始读取,直到遇到\0结束
printf("%s",str);//从首地址开始遇到\0结束 return 0;
使用gets/puts实现字符串的输入输出
gets
gets格式:
#include <stdio.h>
char *gets(char *s);
参数:
char *s:表示输入的字符数组变量名
使用格式:
char str[10];
gets(str);
puts(自带换行)
puts格式:
#include <stdio.h>
char *puts(char *s);
参数:
char *s:表示输入的字符数组变量名
使用格式:
char str[10];
puts(str);
scanf和gets的区别
scanf:不可以输入空格,可以输入任意类型,属于格式解析
gets:可以输入空格,只能输入字符串,键盘读取(gets的输入速度快于scanf)
printf和puts的区别
printf:默认没有换行,可以输出一个或多个任意类型,属于格式解析
puts:自带换行,只能输出一个字符串,键盘读取(puts的输出速度快于scanf)
字符数组长度和字符串长度
字符数组长度:实际字符的个数+1,计算\0
字符串长度:计算实际字符的个数,遇到\0结束
是否是字符串 | 字符数组长度 | 字符串长度 | |
char str[]={'a','b','c'} | 不是 | 3 | 随机值 |
char str[20]={'a','b','c'} | 是 | 20 | 3 |
char str[]="hello" | 是 | 6 | 5 |
char str[20]="hello" | 是 | 20 | 5 |
char str[20]="hel\0lo" | 是 | 20 | 3 |
"abc\0123":\0或者\+0-7的任意三位数都属于八进制,\x属于十六进制,都是一个字符
strlen
非函数实现计算字符串长度
char s[]="hello world";
size_t j,count=0;
for(j=0;s[j]!=0;j++);
printf("%d \n",j);
或
char s[]="hello world";
size_t j,count=0;
for(j=0;s[j]!=0;j++)
{
count++;
}
printf("%d \n",j,count);
strcpy
非函数实现字符串拷贝
char a[]="hello";
char b[]="world";
int i;
for(i=0;b[i]!=0;i++)//对b进行循环
{
a[i]=b[i];//把b赋值给a
}
a[i]=0;//把多余的字符换为\0
练习
实现两个字符串交换
strcat
非函数实现字符串连接
char a[128]="hello";//要保证字符串a的字符数组长度足够大
char b[]="world";
for(int i=0;a[i]!=0;i++);//循环a
for(int j=0;b[j]!=0;j++)//循环b赋值给a
{
a[i++]=b[j];
}
a[i]=0;
strcmp
非函数实现字符串比较
char s1[]="hello";
char s2[]="hell";
int i=0;
while(s1[i]==s2[i])
{
if(0==s1[i])
break;
i++;
}
int sub=s1[i]-s2[i];
if(sub>0)
puts("s1>s2");
else if(sub<0)
puts("s1<s2");
if(sub==0)
puts("s1=s2");
练习
输入三个字符串,求三个字符串的最大值
练习
输入一个字符串,实现字符串的逆置
输入一个字符串,计算小写,大写,数字,空格的个数
补充函数atoi
非函数实现字符串转换整数
char str[128]="";
gets(str);
int i=0;
while(str[i]=' ') //跳过空格
{
i++
}
int k=i;
if (str[i]=='-'||str[i]=='+') //判断+,-
i++;
int sum=0;
while(str[i])//while(str[i]!='\0')
{
if (str[i]>='0'&&str[i]<='9')
{
sum=sum*10+(str[i]-'0');
}
else
break;
i++;
}
if(str[k]=='-')
sum=-sum;
printf("sum=%d\n",sum);
作业
输入一个字符串,实现空格的删除
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{
char str[128]="";
gets(str);
int i,k,a;
printf("%ld\n",strlen(str));
int n=strlen(str);
for(i=0;i<n;i++)
{
while(str[i]==' ') //判断空格
{
for(k=i;k<n;k++)
{
str[k]=str[k+1];
}
i--;
}
}
puts(str);
return 0;
}
输入一个字符串计算单词的个数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{
char str[128]="";
gets(str);
int i,count=0;
int n=strlen(str);
printf("%d\n",n);
for(i=0;i<=n;i++)
{
if(str[i]==' '||str[i]=='\0') //判断空格
{
count++;
}
}
printf("有%d个单词\n",count);
return 0;
}
定义一个字符串并初始化“this is book"判断is的个数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{
char str[]="this is book";
int n=strlen(str),count=0;
for(int i=0;i<n;i++)
{
if ('i'==str[i]&&'s'==str[i+1])
count++;
}
printf("有%d个is\n",count);
return 0;
}
输入一个字符串,实现单词的逆置
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{
char str[128]="";
gets(str);
int head,tail;
int i=0,j=strlen(str)-1;
char t,p;
int m,n;
while(i<j)
{
t=str[i];
str[i]=str[j];
str[j]=t;
i++;
j--;
} //整体逆置
for(m=0;m<strlen(str);m++)
{
if (str[m]!=' ') //判断单词的首位下标
{
head=m;
for(n=m;n<strlen(str);n++)
{
if (str[n]==' '||str[n]=='\0') //判断单词最后一位的下标
{
tail=n-1;
m=n;
break;
}
}
int z,y;
z=head;
y=tail;
while(z<y) //完成单词的逆置
{
p=str[z];
str[z]=str[y];
str[y]=p;
z++;
y--;
}
}
}
puts(str);
return 0;
}