一、字符串常量
(1)字符串的标识方法:“字符串”,必须用双引号
(2)字符串中可以直接表示转义字符;例:“tianyi\n”
(3)测试字符串的大小:sizeof(“字符串”),末尾系统默认增加\0
(4)测试有效字符串的个数:strlen(“字符串”)
例题:
字符串 | 有效字符个数 |
---|---|
sizeof(“chi\0na”) | 7 |
sizeof(“chi\0n\0a\0”) | 9 |
sizeof("\0chi\0na\0") | 9 |
strlen(“chi\0na”) | 3 |
strlen(“chi\0n\0a\0”) | 3 |
strlen("\0chi\0na\0") | 0 |
字符穿的大小sizeof():遇到末尾的\0才结束
有效字符数strlen():是指遇到第一个\0之前的字符
字符串 | 有效字符个数 |
---|---|
sizeof(" ") | 1 |
strlen("") | 0 |
sizeof(’ ') | 这种写法是错误的,至少必须放一个字符,最多放4个,但是只能识别最后一个 |
二、字符串的存储
(1)定义字符数组: char s[81];
(2)初始化:
①char s1[81[={“china”};
②char s1[81]=“china”;
③char s2[]=“china”;
字符串 | 有效字符个数 |
---|---|
sizeof(“china”) | 6 |
sizeof(s1) | 81 |
sizeof(s2) | 6 |
(3)字符串的输入:
①scanf("%s",数组名);
②gets(数组名);
scanf()和gets()的区别:scanf()和gets()均可以输入字符串到字符数组,但是scanf()只接收空格之前的字符,空格之后还可以继续输入但是并不能输出,而gets()可以接受空格之后的字符,输出的时候全部输出。
两者结束标志都是回车键。
(4)字符串的输出
①printf("%s",数组名);
②puts(数组名);
两者均是输出到\0结束,遇到空格不停,但是puts(数组名)会在末尾输出\n,printf("%s",数组名)不会换行,需要手动添加\n。
例如:char s3[81];
(5)【从键盘输入的时候,所有的字符都是字符包括\0,也是字符;在程序的任何位置出现\,就是转义字符】
例如:char s3[81];
从键盘输入:chi\0na
字符串 | 输出 |
---|---|
printf(“%s”,s3) | chi |
puts(s3) | chi\0na |
puts(s+2) | i\0na |
char s4[81]=“chi\0na”;
输出 | |
---|---|
printf("%s",s4) | chi |
printf("%s",s4+1) | hi |
printf("%s",s+strlen(s4)+1 | na |
char s5[81]=“chi\0na”;
s[strlen(s5) ]=‘X’;
输出 | |
---|---|
printf("%s",s5) | chiXna |
三、字符串的遍历
①while循环
char [81] = "china";
int i = 0;
while(s[i]){
处理s[i];
i++;
}
②for循环
L = strlen(s);
for(int i = 0;i<L;i++){
处理s[i];
}
例题:
(1)将一个字符串中的小写字母转换成大写
char s[81] = "chinA";
int i = 0;
while(s[i]>='a' && s[i]<='z'){
s[i] += 32;
i++;
}
(2)将一个数字字符串转换成整数输出
例char s[81] = "7890" --->y = 7890
int k =0;
int y =0;
int i = 0;
while(s[i]){
k = s[i] - '0';
y = y*0+k;
i++;
}
这里k = s[i] - '0'; y = y*0+k;也可以写成一句 y = y*10+s[i]-'0';
这道题首先想着要怎么得到字符串中的每一个字符,1-9的ASII码值,减去字符0的ASII
码刚好得到数字1-9,所以,利用s[i]-'0',,可以得到字符串中的单个字符对应的数字。
接下来要考虑的就是如何把这几个单个的数字组成一个完整的数字。遍历字符串,第一个
得到的字符应该作为数字的最高位,后面的以此类推,那么我们给每次的单个数字乘以10,
然后去加上下一次得到的单个数字,就可以得到完整的数字了。
(3)任意输入两个正整数字符串s1、s2输出它们两个之和
int y1,y2 = 0;
int i1,i2 = 0;
int y;
while(s[i1]){
y1 = y1*10+s[i1]-'0';
i++;
}
while(s[i2]){
y2 = y2*10+s[i2]-'0';
i++;
}
y = y1+y2;
分别把s1、s2中的字符串转换程数字,然后相加就可以,但是显然把一段代码重复写了两遍,
有没有更好的办法呢?
(4)输入一个十进制数,把十进制数转换成二进制,输出转换的二进制中含1的个数
#include<stdio.h>
#include<string.h>
void main(){
char arr[11];
int i = 0;
int num;
int count = 1;//统计转换成二进制后含有1的个数;
//因为不管怎样除几次2,最后都会剩下一个1,所以count的初始值为1
printf("请输入一个正整数");
scanf("%d",&num);
while(num>1){
arr[i] = num % 2;
num = num / 2;
i++;
}
for(i = 0;i<11;i++){
if(arr[i] == 1){
count++;
}
}
printf("%d\n",count);
}
(5)输入一个字符串,把字符串前半部分的字符和后半部分的字符交换位置,如果字符数为奇数,最中间的那个数不动
例:abcdefg
交换后:efgdabc
#include<stdio.h>
#include<string.h>
#define N 66
void main(){
char s[N];
int len = strlen(s);
char temp = 0;
int i = len/2-1;
int j = len-1;
printf("请输入字符串");
scanf("%s",s);
while(i>-1){
temp = s[i];
s[i] = s[j];
s[j] = temp;
--i;
--j;
}
printf("%s\n",s);
}