c语言常量变量

c语言常量变量

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

c 复制代码
   #define num 10  //这里不需要分号
   int a=num;

enum枚举常量

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

错误语法注意

c 复制代码
//定义常变量
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才结束

c 复制代码
 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() 函数将接收输入的整个字符串直到 回车 为止。
c 复制代码
    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作为函数值返回。

c 复制代码
 	 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允许指定一个最大字符数,从而可以防止缓冲区溢出,更加安全。
c 复制代码
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'

相关推荐
一颗松鼠3 分钟前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript
有梦想的咸鱼_5 分钟前
go实现并发安全hashtable 拉链法
开发语言·golang·哈希算法
海阔天空_201311 分钟前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
天下皆白_唯我独黑18 分钟前
php 使用qrcode制作二维码图片
开发语言·php
QAQ小菜鸟21 分钟前
一、初识C语言(1)
c语言
夜雨翦春韭22 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
小远yyds23 分钟前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js
何曾参静谧36 分钟前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
互联网打工人no140 分钟前
每日一题——第一百二十一题
c语言
q567315231 小时前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash