c函数之常见错误
c吧
全部回复
仅看楼主
level 6
函数是c语言最基本的单位,c语言是一个函数式的语言,要学懂c语言必须理解函数设计和实现,很多初级开发者由于对函数理解不到位,在项目开发中总是犯一些“基础”的错误,本次通过实例对各种常见的错误进行了整理,希望对各位开发者起到帮助的作用。
网上前几年有一个资料《c语言面试100题》,其中笔试代码编写部分就明显的犯了很多基础性的错误,甚至有些代码是错误,完全不值得参考。从中选择了几个典型案例,指出函数设计中常见的错误。
案例1: 请编写一个 C 函数,该函数将给定的一个字符串转换成整数
代码如下:
int Invert(char *str)
{
int num=0;
while(*str!='\0')
{
int digital=*str-48;
num=num*10+digital;
str=str+1;
}
return num;
}
问题:
1、指针作为函数的参数时,通过指针仅是读取它所指向的空间中内容,不修改,则必须用const修饰,案例中没有使用。
2、编写代码要注释格式,务必做到以下基础要求
命名:见名知意
空行:代码分段
空格:运算符两边都加空格
换行:一行仅写一句话
对齐:同级别代码严格对齐
缩进:代码具有层次感
注释:对代码解释说明
大家看一下以上代码都犯了哪些错误。
3、如果用const修饰了,const char *str,表名str代表了字符串,str不要改变指向,案例中str =str + 1的写法不合适。
4、在while语句中:
int digital,定义变量,c语言要求:声明语句放在可执行语句之前,不应该将声明语句和可执行语句放在循环体中。
案例2:请编写一个 C 函数,该函数将给定的一个整数转换成字符串。
void IntToCharChange(int num, char* pval)
{
char strval[100];
int i, j;
int val0 = 0;
int val1 = 0;
val0 = num;
for(i=0; i<100; i++)
{
val1 = val0 % 10; //取余
val0 = val0 / 10; //取整
strval[i] = val1 + 48; //数字—字符
if(val0 < 10)
{
i++;
strval[i] = val0 + 48;
break;
}
}
for(j=0; j<=i; j++) //倒置
pval[j] = strval[i-j];
pval[j] = '\0';
}
问题(重复错误不再说明):
5、函数中定义的数组为 char strval[100],试问这个100从何而来,程序中不能随意出现常量,如果要出现,必须说明原因和理由并且用宏定义取代。我感觉作者是将main函数和子函数分不清楚导致的,main函数称为测试函数,随意出现100或者50无所谓,子函数是要提交的代码,必须具有公共性,开发者是一个编写子函数人员。
6、定义变量必须全部要初始化,这是编程规范的要求,不能随意的初始化。
7、编程实现的方法很随意,直接在for中加入break语句,整数分解算法是早已经定型的方法,这个写法破坏可读性。
while(num > 0)
{
bit = num % 10;
num = num / 10;
}
获取整数中每一位数字。
8、函数没有返回值,开发过程中很少出现函数没有返回值的情况,很多初学者在设计函数时,通常都没有返回值,这是一个典型的错误。
该函数返回类型是char *,返回值是pval,方便调用者使用。
案例3:实现strcmp函数 。
int mystrcmp(const char* str1, const char* str2)
{
assert((str1 != NULL) && (str2 != NULL));
int ret = 0;
while (!(ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str2)
{
str1++;
str2++;
}
if (ret > 0)
ret = 1;
else if (ret < 0)
ret = -1;
return ret;
}
问题:
9、命名要特别注意,禁止使用my或者her等类似字眼,禁止使用汉语拼音。10、while语句使用的特别怪异,破快可读性
正确形式:
while(表达式1)
{
循环体
if(表达式2) break;
}
错误形式:
while(表达式1&&表达式2)
{
循环体
}
11、strcmp函数的返回值是大于0,等于0或者小于0,而非1 0 或者-1,对基本库函数返回值理解都是错误的。
通过这三个案例列出了函数编写过程中常见的11种错误,特别提醒如果你看到了《c面试100题》这个资料,其中的笔试部分的答案几乎都是错误的,并不是标准答案,是一个没有任何工作经验的人胡乱拼凑的答案,完全不值得参考
2026年04月14日 02点04分 1
1