c语言基础笔记(8.字符串与字符数组)

字符串一定是在内存中以0结尾的一个char数组。

8.1 字符数组定义

char array[100];

8.2 字符数组初始化

char array[100] = {‘a’,‘b’,‘c’,‘d’};
char array[100] = ”abcd”;
char array[100] = {0};
char array[] = “abcd”;

8.3 字符数组使用

#include<stdio.h>
//字符串倒序
int main()
{
     char buf[100] = "hello world";
     int len = 0;
     while (buf[len++]);
     len--;
     int i = 0;
     int j = len -1;
     while (i < j)
    {
         char tmp = buf[i];
         buf[i] = buf[j];
         buf[j] = tmp;
         i ++;
         j --;
    }
    printf("%s\n",buf);
    return 0;
}

ASCII一个字节存放一个字符
GBK用两个字节存放一个汉字

8.4 随机数产生函数rand与srand

头文件stdilb.h
rand是伪随机数产生器,每次调用rand产生的随机数是一样的
如果调用rand之前先调用srand就出现任意的随机数
只要能保证每次调用srand函数的时候,参数的值是不同的,那么rand函数就一定会产生不同的随机数
Srand() //随机数种子发生器
Rand() //随机数产生器

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
    int t = (int)time(NULL);
    srand(t);
    for(int i=0; i<10; i++)
     {
        printf("%d\n",rand());
   }
   return 0;
}

8.5 用scanf输入字符串

“%s”的作用就是输入一个字符串的,scanf是以回车键作为输入完成标志的,但回车键本身并不会作为字符串的一部分。
如果scanf参数中的数组长度小于用户在键盘输入的长度,那么scanf就会缓冲区溢出,导致程序崩溃。

8.6 字符串的结束标志

scanf将回车、空格都认为是字符串输入结束标志

8.7 字符串处理函数

8.7.1 gets
gets(s);
Gets认为回车是输入结束的标志,空格不是输入结束的标志,所以用gets这个函数就可以实现输入带空格的字符串,但是gets和scanf一样存在缓冲区溢出的问题
Gets不能用类似“%s”或者“%d”之类的字符转义,只能接受字符串的输入

8.7.2 fgets函数

gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。多出来的字符会导致内存溢出,fgets函数改进了这个问题。
由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便。
Char s[100] = {0};
fgets(s ,sizeof(s) ,stdin);//第一个参数是char的数组,第二个参数是数组的大小,单位:字节,第三个参数stdin代表标准输入的意思。
fgets是安全的,不存在缓冲区溢出的问题,调用fgets的时候,只要能保证第二个参数小于等于数组实际的大小,那么就可以避免缓冲区溢出的。

8.7.3 puts函数

Puts函数打印字符串,与printf不同,puts会在最后自动添加一个’\n’
Char s[] = “hello world”;
Puts(s);

8.7.4 fputs函数

fputs是puts的文本操作版本
char s[] = “hello world”;
fputs(s,stdout);
8.7.5 strlen,字符串长度
size_t strlen(const char * _str);
返回不包含字符串结尾’\n’的字符串长度
Char s[100] = “hello world”;
Int len = strlen(s);
Printf(“len = %d\n”,len);

8.7.6 strcat,字符串追加
size_t strcat(char * _str1,const char * _str2);
将参数_str2追加到_str1后尾
Char s1[100] = “fsfgg”;
Strcat(s,s1);
Strcat也存在缓冲区溢出的问题

8.7.7 strncat,字符串有限追加
size_t strncat(char * _str1,const char * _str2,size_t len);
Strcat(s,s1,3); //合并的时候可以限制追加多少个字符
8.7.8 strcmp,字符串比较
int strcmp(const char * _str1,const char * _str2);
比较两个字符串是否相等,相等返回0,不相等返回非0
If(strcmp(s1,s2)) = = 0)
{
Printf(“相同\n”);
}

8.7.9 strncmp,字符串有限比较
If(strncmp(s1,s2,5) = = 0) //strncmp的意思是只比较指定数量的字符。

8.7.10 strcpy字符串拷贝
Char *strcpy(char * _str1,const char * _str2);
将参数_str2拷贝到参数_str1中
Strcpy(s1,s2);

8.7.11 strncpy字符串有限拷贝
Strncpy(s1,s2,3);

8.7.12 sprintf格式化字符串
和printf函数功能类似,printf函数将格式化结果输出到屏幕,sprintf将格式化结果输出到字符串
int i = 200;
char s[100] = {0};
sprintf(s, “I = %d”,i);

8.7.13 Sscanf函数
Sscanf类似于scanf函数,scanf从键盘读取用户输入,scanf从指定格式化字符串读取输入

8.7.14 strchr查找字符
Char * strchr(char * _Str, int _Ch);
在参数_str中查找参数_ch指定字符,找到返回字符_ch在_str中所在位置,没有找到返回NULL;

8.7.15 strstr查找子串
Char * strstr(char * _Str,const char * _SubStr);
在参数_str中查找参数_SubStr指定子串,找到返回子串在_Str中所在位置,没有找到返回NULL;

8.7.16 strtok分割字符串
字符在第一次调用时strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL每次调用成功则返回指向被分割出片段的指针。
如果strtok没有找到指定的分割符号,那么返回NULL
Char buf [] = “abcd@efg@h”;
Char *p = strtok(buf,”@”);
While§
{
Printf(“%s\n”,p);
P = strtok(NULL,”@”);
}

8.7.17 atoi转化为int

int i1 = atoi(a); //将字符串转化为一个整数
需要包含头文件stdlib.h

8.7.18 atof转化为float

8.7.19 atol转化为long

#include <string.h>  //计算字符串
int calc_string(const char *s)
{
	char buf1[100] = {0};
	char oper1 = 0;
	char buf2[100] = {0};
	int len = strlen(s);//得到字符串的长度
	int i;
	int start;
	for(i=0;i<len;i++)
	{
		if(s[i] == '+'|| s[i] == '-' || s[i] == '*' || s[i] == '/')
		{
			strncpy(buf1, s, i);
			oper1 = s[i];
			break;
		}
	}
	start = i + 1;
	for(;i<len;i++)
	{
		if(s[i] == '=')
		{
			strncpy(buf2,&s[start],i-start);
		}
	}
	printf("buf1 = %s,oper1 = %c,buf2 = %s\n",buf1,oper1,buf2);
	switch(oper1)
	{
	case '+':
		return atoi(buf1) + atoi(buf2);
	case '-':
		return atoi(buf1) - atoi(buf2);
	case '*':
		return atoi(buf1) * atoi(buf2);
	case '/':
	{
		int a = atoi(buf2);
		if(a)
			return atoi(buf1) / atoi(buf2);
		else
			return 0;
	}
	}
}
int main()
{
	const char *s = "32 + 56 =";
	printf("%d\n",calc_string(s));
	return 0;
}

写在最后:最近和朋友一起在微信公众号做一些自己热爱的东西,并有许多的干货分享,大家多多关注啊!!
公众号 [越陌的数字生活]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值