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
- 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'