C语言知识细节:浮点数和字符串

1、浮点数
float与double都只能接近零,但无法表示0,有+inf,-inf表示无穷大和无穷小
float有效数字是7位,scanf读取用%f,printf打印可以用%f或%e
double有效数字是15位,scanf读取用%lf,printf用%f,%e
计算机表达的只是离散的数,要是赋值给一个没有的数它只能近似的赋给一个离它最近的数。
a=1.234f:不标注f则为double类型,浮点数不能直接相等用fabs(a-b)<1e-8,不能用浮点数做精确运算,浮点数内部不是二进制数,而是一个编码的数。没有特殊需要只用double,不会比float慢。

2、字符类型
char既是整数又是一种字符
''也是一种字符
printf和scanf里用%c来输出

char c;
char d;
c=1;
d='1';
printf(c==d)//0
printf("c=%d\n",c);//1
printf("d=%d\n",d);//49,是ASCII码
//'A'是65
scanf("%c",&c);->1//作为整数c是49,作为char是'1'
scanf("%d",&i);c=i;->1//c作为整数是1,作为char是''
->49:
//整数是49,char是'1'
49=='1'//结果是1

字符计算

char c='A';
c++;
printf("%c",c)//结果是B
//在ASCII码中大写字母和小写字母是分开排列的
//up+'a'-'A'可以把一个大写字母变成小写字母
//low+'a'-'A'可以把一个小写字母变成大写字母

3、字符串
char world[]={‘H’,‘O’,‘l’,’!’,’\0’};
末尾表示整数0,但是与’0’不同。总共有5个,有\0才会成为字符串,否则不能有字符串方式运算。\0标志字符串的结束,但不是字符串的一部分,计算长度也不会包括它。
字符串的储存方式就是数组或者指针,可以用数组或者指针的方式去使用它
string.h有很多字符串函数

//字符串定义
char *str="Hello";
char word[]="Hello";
char line[10]="Hello";
//占六个空间,会自动生成一个结尾\0,数组长度是6,但字符串长度是5
//两个相邻字符串会被自动连接

//字符串常量
char *str="Hello";
char *s="Hello";
s[0]='B';//打印s[0]会出错
//打印str后与s的地址相同,且很小,位于程序的代码段,是只读的。

//用数组方式定义字符串而不用指针定义
char s[]="Hello";//会在正常的地址存储
s[0]='A';//可以修改,在本地变量里

用指针做为字符串,多用于不改变的字符串,处理参数或者动态空间分配。

char *s="Hello";
char *t;
t=s;//没有制造新的字符串,而是让t指向s的字符串

4、字符串输入输出

char string[8];
scanf("%s",string);//scanf读入一个单词,但空格,tab或者回车为止
//输入Hello World
printf("%s##\n",string);
//打印为Hello##,没有包含空格,没有读到world
//如果程序中有两个scanf
char string[8];
char string1[8];
scanf("%s",string);//scanf读入一个单词,但空格,tab或者回车为止
scanf("%s",string1);
//仍然输入Hello World!
printf("%s##%s\n##",string,string1);
//打印为Hello##world!##,没有包含空格,空格只是分隔符。

scanf是不安全的,因为不知道输入数组的大小

可以在scanf里加入scanf(“7%s”);这样只会接受7个字符,这样就不会使程序出现问题。剩下的未读取内容会交给下一个scanf读取

char * string;
scanf("%s",string);
//不能认为char*是字符串类型而直接使用string,第一行只是定义了一个指针变量,没有只想地址,scanf可能会使string指向其它地方,可能会引起程序崩溃。
//指针一定要指向一个有效的地址
char buffer[100]="";//空字符串
//buff[0]='\0'
char buffer[]="";//数组长度只有一

5、字符串数组

char **a;
//a是一个指向另一个指针的指针,那个指针指向一个字符(串),并不是字符串数组
char a[][10];//第二维一定要有具体值
//a[0]相当于char[10]
char *a[];//这是最好的
//a[0]相当于char *,对于每个元素的大小没有限制,因为它是指向其它的字符串
//main函数的参数
int main(int argc,char const *argc[]){
//argc是后面那个的大小
    int i;
    for (i=0;i<argc;i++){
        printf("%d:%s\n",i,argv[i]);
    }
}
//结果0:/a.out
//但main函数可以读到在执行命令时在后面输入的东西

5、putchar和getchar()

int putchar(int c);
//向标准输出写一个字符
//返回写了几个字符,EOF(-1)表示写失败
 int getchar(void);
 //从标准输入读入一个字符,返回类型是int,要返回EOF表示输入结束
#include <stdio.h>

int main(int argc,char const *argc[])
{
    int ch;
    while ((ch=getchar())!=EOF){
        putchar(ch);
    }
    printf("EOF\n");
    return 0;
}
//输入1231412412
//返回1231412412
//之后还可以继续输入(输入EOF,-1都没用),用ctrl+c可以强制结束,ctrl+z会返回EOF,说明遇到了EOF

6、string.h

strlen(s);//返回s的长度,不包括/0
strcmp(s1,s2);//比较两个字符串,相等返回0,若s1>s2返回正数还能比较出谁大谁小
//若是单纯比较s1==s2是不对的,因为这是地址的比较,
//strcmp('a','A')返回32,是'a'-'A'
/*从0开始第一个不相等的相减,返回结果
int mycmp(const char *s1,const char *s2){
    int idx=0;
    while(*s1==s*2 and *s1!='\0'){
        s1++;//移动指针
        s2++;
    }
    return *s1-*s2;
}
*/
strcpy(char*restrict dst,const char* restrict src);
//把src的字符串拷贝到dst
//restrict表明src和dst不重叠,指的是存储位置不能有交叉
//返回dst

char *dst=(char*)malloc(strlen(src)+1);
strcpy(dst,src);
/*
char* mycpy(char* dst,const char* src){
    int idx=0;
    while (src[idx]!='\0'){
        dst[idx]=src[idx];
        idx++;
    }
    idx++;
    dst[idx]='\0';//或者改成do while
    return dst;
}
*/

//strcat做连接
char* strcat(char *restrict s1,const char * restrict s2);
//把s2拷贝到s1后面,接成一个长的字符串,返回s1。
//s1必须有足够空间
//从dst[strlen(dst)]开始copy
s//trcpy和strcat都可能出现安全问题,可以使用
strncpy(chs1,s2,size_t n);
//最多可以拷贝多少字符
strncat(s1,s2,n);
strncmp(s1,s2,n);//比较前n个
//字符串里找字符第一次出现的位置
char* strchr(const char *s,int c);
//返回NULL表示没找到,找到则返回指针,指向要找的字符
char s[]="hello";
char *p=strchr(s,'l');
printf("%s\n",p);
return 0;
//结果是llo

char s[]="hello";
char *p=strchr(s,'l');
char c=*p;
*p='\0';
char *t=(char *)malloc(strlen(s)+1);
srcpy(t,s);
printf("%s\n",t);
free(t);
return 0;
//结果是he,因为把5p变成了\0,这样s就被截断了
char *strstr(const char *s1,const char *s2);//在s1里找s2
char *strcasestr(const char *s1,const char *s2)//忽略大小写寻找
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值