【C语言】一些常犯的小错集合2
字符和字符串
不知道大家有没有犯过这种错,反正我是在定义字符类型的时候忘加单引号或者是加成了双引号。
在此记录一下正确的方式:
char定义的字符要用单引号引起(使用单引号作为定界符):
char ch = 'w';
而字符串则需要双引号引起(使用双引号作为定界符):
char arr[] = "hello";
char *p = "abcde";
ps:字符串的结束标志是一个 \0 的 转义字符。
在计算字符串长度时 \0 是结束标志,不算作字符串的内容,即用%s打印字符串时遇到 \0 即停止。
那么问题来了,下面的代码会打印出什么结果?
#include <stdio.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a', 'b', 'c' };
char arr3[] = {'a','b','c','\0'};
char arr4[4] = { 'a', 'b', 'c' };
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
printf("%s\n", arr4);
return 0;
}
答案是:
出现了!烫烫烫!
上面有说过%s遇到\0时即停止打印,那么arr2[]中有没有\0呢?
答案是:没有。所以这种时候用%s打印后会多出一些随机值。
遇见这种情况解决方式就要像arr3[]那样自己加入’\0’,亦或者给数组直接定义大于等于3的空间,让它能有位置放入’\0’。
转义字符
转义字符顾名思义就是转变的意思。
容易出错的地方不在于转义字符本身的使用,而是在某些时候会导致输出结果不是自己想要的结果。
先给部分常用的转义字符看看:
再来看看我掉过的坑:
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abc"));
printf("%d\n", strlen("c:\test\328\text.c"));
return 0;
}
strlen()是求字符串长度的函数,遇到\0就会停止计数。
ps:strlen()也是<stdio.h>里的库函数。
那么上面的程序会输出什么?
3就不用多说了,14是怎么出来的呢?
在这里面,有转义字符 \t 和 \32(两个八进制数)
选择语句
最经典的错误:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a){
case 1:
printf("1\n");
case 2:
printf("2\n");
default:
printf("输入有误\n");
}
system("pause");
return 0;
}
看出哪里有问题了吗?
没错,掉了break来跳出语句。这样无论输入什么数都会导致输出有误。
正确应当在每个case执行后都加上break(除过某些特殊情况比如:几个case在一个判断范围内,则只需要在范围内的最后一个case加上break)。
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a){
case 1:
printf("1\n");
break;
case 2:
printf("2\n");
break;
default:
printf("输入有误\n");
break;
}
return 0;
}
END
下次写写操作符的使用会出现的小错误(其实都是数学没学好 )