欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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;
}