字符串(1)

一、字符串常量
(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)+1na

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值