c语言常量变量

c语言常量变量

const 修饰常变量
#define定义标识符常量

   #define num 10  //这里不需要分号
   int a=num;

enum枚举常量

enum Color
{
	RED,
	GREEN,
	BLUE
};
int main(){
	enum Color c=RED;//枚举常量不允许修改
}
//定义常量
int a=10;
char b='a';

错误语法注意

//定义常变量
const int a=10;//本质是变量,有着常量的属性,常变量不允许修改
a=20;  //此时a修改会报错  报错提示是a为只读变量无法读取


int a = 10;
int arr[a] = {0};//会给你提示数组中的个数a必须是定量不能是变量


const int a = 10; //使用常变量定义数组个数  同样的错误跟提示语句
int arr[a] = {0};//会给你提示数组中的个数a必须是定量不能是变量

在这里插入图片描述
在这里插入图片描述

字符串变量char

  • 字符串定义的两种方式
    • 使用大括号包含字符的形式,注意字符用单引号标识
    • 使用双引号里面直接输入字符串

特别注意第一种方式定义字符串的话后面不加\0那么最终会有乱码出现,乱码出现的原因是因为定义字符串使用%s读取的时候是从当前读取一直在内存中找到\0才结束

 char arr[] = {'a', 'b', 'c', 'd'};//这种属于字符数组不属于字符串
 char arr0[] = {'a', 'b', 'c', 'd','\0'};//正确写法
 char arr1[]="abcd";
 for (int i = 0; i < 4; i++)
 {
     printf("%c", arr[i]);//a,b,c,d  ,由此表明此写法只能代表字符数组
 }

 printf("%s", a);//abcd乱码
  printf("%s", arr0);// abcd
  printf("%s", arr1);  abcd

gets 安全性不高慎重使用

  • gets()函数用来从 标准输入设备(键盘)读取字符串直到 回车结束,但回车符(‘\n’)不属于这个字符串
  • 调用格式为:
    gets(str)
    其中str为字符串变量(字符串数组名或字符串指针)。
    gets(str) 函数与 scanf(“%s”, &str) 相似,但不完全相同,使用 scanf(“%s”, &str) 函数输入字符串时存在一个问题,就是如果输入了 空格 会认为输入字符串结束。空格后的字符将作为下一个输入项处理, 但 gets() 函数将接收输入的整个字符串直到 回车 为止。
    char arr[10];
    gets(arr);
    printf("%s", arr);

fgets

  • fgets()函数用来从 标准输入设备(键盘)读取字符串;
    调用格式为:
    fgets(str,n,stdin);

此处,stdin是文件指针 通常使用stdin代表是从键盘输入;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加’\0’,并以str作为函数值返回。

 	 char arr[10];
    fgets(arr, 4, stdin);//输入abcd结果是    abc+'\n'
	if(arr[strlen(arr) - 1] == '\n')  {      //在做字符串拼接的时候需要 去掉换行符
     arr[strlen(arr) - 1] = '\0'; }
    printf("%s", arr);

总结

scanf/gets/fgets三者的区别

  • scanf
    1.scanf是一个格式化输入函数,它可以根据指定的格式从标准输入读取数据。
    2.使用scanf读取字符串时,需要小心处理缓冲区溢出的问题,因为scanf不会自动检查目标缓冲区的大小。
    3.scanf在读取字符串时遇到空格、制表符或换行符会停止。
  • gets
    1.gets函数从标准输入读取一行,直到遇到换行符为止,并将换行符替换为字符串结束符\0。
    2.gets不检查目标缓冲区的大小,因此非常容易导致缓冲区溢出,引发安全问题。因此,在现代C语言编程中,gets函数已被弃用。
  • fgets
  1. fgets函数也从标准输入读取一行,直到遇到换行符或达到指定的最大字符数。
    2.fgets会将换行符一起读入字符串(如果需要可以手动去除),并在字符串末尾添加\0。
    3.fgets允许指定一个最大字符数,从而可以防止缓冲区溢出,更加安全。
char a[] = "ab";
 char b[] = "ab\0";   //'\0'转义字符算一个
 printf("%d", sizeof(a)); // 3 加上'\0'的长度
 printf("%d", strlen(a)); // 2  不加上'\0'的长度
 printf("%d", sizeof(b)); // 4  加上'\0'的长度 
 printf("%d", strlen(b)); // 2  不加上'\0'的长度
 
 char a[10] = "";
 scanf("%s", a); //abc  cdd
 printf("%d", strlen(a));//3
 printf("%s", a);//abc  遇空格结束
 gets(a);
 printf("%s", a);//abc  cdd 遇空格不会结束
 printf("%d", strlen(a));//7
 fgets(a,7, stdin); //如果第二个参数是n  那么输出字符就是n-1 因为算上了换行符
  printf("%s", a); //abc cd
 printf("%d", strlen(a)); //6

sizeof(arr) 计算长度加上‘\0’
strlen(arr)计算不加上’\0’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

请叫我斌哥哥

给打赏的我会单独一对一讲解

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

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

打赏作者

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

抵扣说明:

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

余额充值