C语言中易错函数实例讲解
程序员文章站
2022-05-24 19:04:28
strncmp
用于比较两个字符串是否相等。
int strncmp ( const char * str1, const char * str2, size_t n );...
strncmp
用于比较两个字符串是否相等。
int strncmp ( const char * str1, const char * str2, size_t n );
防坑点:这里的长度 n 必须是 sizeof(str1) 或 strlen(str1)+1,保证“\0”也进行比较,否则n=2时“ab”和“abc”也被判为相等。
#include #include int main() { char arg[10]; scanf("%s", arg); if(!strncmp("jack", arg, sizeof("jack"))){ printf("right !\n"); } else { printf("%s is wrong\n", arg); } return 0; }
strtol
strtol()会将参数nptr字符串根据参数base来转换成长整型数。
long int strtol(const char *nptr, char **endptr, int base);
strtol()会跳过参数nptr前面的空格字符,直到遇上数字或正负符号开始做base进制转换,再遇到非数字或字符串结束时(‘\0’)结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回;若参数endptr为NULL,则不返回非法字符串。
防坑点:如下使用 ‘\0’!=*endstr 确保arg中是全数字,但是arg若为NULL,转化后endstr 也为空,引用空指针便会出错。故无法确定arg是否为NULL时需要对endstr做非空判断处理。
#include int main() { char *arg; char *endstr; scanf("%s", arg); int var = strtol(arg, &endstr, 10); if(NULL == endstr){ printf("err!\n"); goto err; } if(var<0 || var>100 || '\0'!=*endstr){ printf("wrong endstr: %s!\n", endstr); } else { printf("%d is OK!\n", var); } err: return 0; }
建议calloc代替malloc
void *calloc(size_t n, size_t size);
calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。
#include int main() { char *str=(char *)malloc(sizeof(char)*100); //相当于静态字符数组str[100],但大小可以更改的 typedef struct pointer{ int data; struct pointer *p; } pt; pt *p=(pt *)calloc(1, sizeof(struct pointer)); //动态申请结构体空间 return 0; }
上一篇: C++ Socket 一个服务器 多个客户端 (阻塞式)
下一篇: 翻翻身,您又打呼噜了
推荐阅读