字符串一定是在内存中以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;
}
写在最后:最近和朋友一起在微信公众号做一些自己热爱的东西,并有许多的干货分享,大家多多关注啊!!
公众号 [越陌的数字生活]