c语言学习笔记-字符串(1)

之前这快有点迷迷糊糊,我想在指针前来看看这个,看起来好像比较简单

so,我们可以将字符串和我们前面比较熟悉的数组结合起来

·字符串的存储和运算可以用一维字符数组实现
·一维字符数组的定义、引用、初始化与其他类型的一维数组一样。

 

字符串常量

用一对双引号括起来的字符序列

一个字符串结束符 '\0',像这个

4fb694c1f5a042a2a9cdd6c6f9c2bceb.png

 PS:字符串的有效长度:有效字符的个数

                 简而言之,字符串即是一个特殊的一维字符数组

                 其操作也即是如此:

· 把字符串放入一维字符数组(存储)
· 对字符串的操作 ===> 对字符数组的操作

普通字符数组:数组元素的个数是确定的,一般用下标控制循环

字符串:没有显式地给出有效字符的个数,只规定在字符串结束符 '\0' 之前的字符都是字符串的有效字符,一般用结束符 '\0' 来控制循环

所以我们有了一个very nice的循环条件:s[i] != '\0'

比如看看下面这个题

64ee0794056043bf9beeeab15eb1a308.png 输出样例:

51c3c52db5154d6aa4586a9c58c8c8c8.png

#include<stdio.h>
int main (void)
{
	char ch;
	scanf("%c",&ch);
	while(ch!='\n')
	{
		if(ch>='A'&&ch<='Z')
		{
			if(ch=='Z')
			{
				ch=ch-'A'+'a'-25;//这里要变化后移一位
			}
			else
			{
				ch=ch-'A'+'a'+1;
			}
		}
		else if(ch>='a'&&ch<='z')
		{
			if(ch=='z')
			{
				ch=ch-'a'+'A'-25;
			}
			else
			{
				ch=ch-'a'+'A'+1;
			}
		}
        printf("%c",ch);
        ch=getchar();
	}
	return 0;
 }

 ps:我最近还是整理了些我这个水平可能用到的c语言函数库,等会儿来冲

好吧这道题有点那么费脑瓜子(对于不那么熟悉ASCII码来说有点)

那就再来一道[dogc]

41154615b7e34772842b45506e0bcf63.png

#include<stdio.h>
#include<string.h>
int main(void)
{
	char a[100];
	int i,j;
    gets(a);
	int len;
	len=strlen(a);
		for(j=len-1;j>=0;j--)
	    printf("%c",a[j]);
	return 0;
}

 还有很典型的凯撒密码

bbacd93ee2964ccb9136cf1e891acaf3.png

 

输入一个以回车符为结束标志的字符串,再输入一个正整数offset,用凯撒密码将其加密后输出。

·将明文中的所有字母都在字母表上向后偏移offset位后被替换成密文
·当偏移量offset是2时,表示所有的字母被向后移动 2 位后的字母替换
·所有的字母 A 将被替换成C,字母 B 将变为 D,…,字母 X 变成 Z,字母 Y 则  变为 A,字母 Z 变为 B。
#include <stdio.h>
#include <math.h> 
int main(void)
{
	unsigned char a[80];
	int x = 0;
	int y;
	int offset;
	while( (a[x] = getchar()) != '\n' )
	{
		x++;
	}
	scanf("%d", &offset);
	if( offset > 0 )
	{
		y = offset % 26;//这步实在绝,俺是查的[求放过]
		for( int i = 0; i < x; i++ )
		{
			if( a[i] >= 'A' && a[i] <= 'Z' )
			{
				a[i] += y;
				
				if( a[i] > 'Z' )
				{
					a[i] -= 26;
				}
			}
			else if( a[i] >= 'a' && a[i] <= 'z' )
			{
				a[i] += y;
				
				if( a[i] > 'z' )
				{
					a[i] -= 26;
				}
			}
			
			printf("%c", a[i]);
		}
	}
	else if( offset < 0 )
	{
		offset = fabs(offset);
		y = offset % 26;
		for( int j = 0; j < x; j++ )
		{
			if( a[j] >= 'A' && a[j] <= 'Z' )
			{
				a[j] -= y;
				if( a[j] < 'A' )
				{
					a[j] += 26;
				}
			}
			else if( a[j] >= 'a' && a[j] <= 'z' )
			{
				a[j] -= y;
				if( a[j] < 'a' )
				{
					a[j] += 26;
				}
			}
			printf("%c", a[j]);
		}
	}
	else
	{
		for( int k = 0; k < x; k++ )
		{
			printf("%c", a[k]);
		}
	}
	
    return 0;
}

这个

e24712542bd7483898653ced4a8b9207.png

#include<stdio.h>
#include<string.h>
int main (void)
{
	char a[100];
	char b[100];
	gets(a);
	int x,y;
	y=0;
	x=strlen(a);
	int i,j,m,n;
	for(i=0;i<x;i++)
	{
		if(a[i]>='A'&&a[i]<='Z')
		{
			b[y]=a[i];
			y++;//数组b长度 
		}
	}
	if(y==0)
	{
		printf("Not Found");
	}
	for(i=0;i<y;i++)
	{
		m=0;
		for(j=0;j<i;j++)
		{
			if(b[i]==b[j])
			{
				m=1;//标记重复 
			}
		}
		if(m==0)
		{
			printf("%c",b[i]);
		}
	}
	return 0;
}

958fd9f6735c4bcab6a920c8c19dccd9.png 


算了还是丢这里吧

1. 1. ctype.h

2. 2. 1.isalpha():测试一个字符是否为字母,是则返回1,否则返回0。

3. 3. 2.isdigit():测试一个字符是否为数字,是则返回1,否则返回0。

4. 4. 3.isupper():测试一个字符是否为大写字母。

5. 5. 4.islower():测试一个字符是否为小写字母。

6. 6. 5.toupper():将小写字母转成大写字母,并返回。

7. 7. 6.tolower():将大写字母转成小写字母,并返回。

8. 8.  

9.  

1. string.h

2. 1.strcpy():将一段字符串的内容复制到一个字符数组中。

3. 2.strlen():计算一个字符数组中字符串的长度。不包括null零

4. 3.strcat():合并两个字符数组。

5.  

 1. stdio.h

 2. 1.puts():输出一个字符串。默认在末尾加换行符。

 3. 例:puts("www.baidu.com");

 4. puts(table); // talbe是一个字符数组

 5. 2.gets():获取一个字符串,以Enter结尾.

 6. 3.fopen():获取一个文件入口地址

 7. 4.fclose():关闭一个文件。

 8. 5.fprintf():向文件中输入字符串信息。

 9. 6.fgets():读一行数据。

10. 7.fputs():输出数据到文件。

11. 8.feof():检测是否到达文件末尾。

12. 9.fseek():随机访问文件

13.  

 1. math.h

 2. 1.ceil():向上取整,返回值为浮点数

 3. 2.floor():向下取整,返回值为浮点数

 4. 3.fabs():返回浮点绝对值

 5. 4.cos(x):返回角x的余弦值

 6. 5.sin(x):返回角x的正弦值

 7. 6.tan(x):返回角x的正切值

 8. 7.pow():计算一个值的幂

 9. 8.sqrt():返回一个值的平方根

10. 9.exp(x):返回e^x的值

11. 10.log(x):返回x的自然对数,数学上写成ln(x)。

12. 11.log10(x):返回以10为基的对数。

13.  

 1. 1. stdlib.h

 2. 2. 1.rand():随机产生一个0到32767的值。如果没有给rand()设置产生随机数的种子,那么它总是生成同样的随机数。

 3. 3. 2.srand():设置随机数生成种子。

 4. 4.  

 5. 一个产生正真随机数的例子:

 6. 1. #include

 7. 2. #include

 8. 3. #define NUM_CARDS54

 9. 4. time_t t;

10. 5. srand(time(&t));

11. 6. sub_draw = (rand()%(NUM_CARDS));

12. 7.  

13. 3.malloc():分配堆内存

14. 例:

15. 1. int *temps;

16. 2. temps = (int *)malloc(10*sizeof(int));

17. 3.  

18. 4.free():释放堆内存

19.  

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ryan-%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值