strtol help为什么返回0

约书亚·蒂夫(Joshua Theeuf)

因此,我对为什么内置strtol函数返回0感到困惑。从手册中说,如果无法进行转换,它将返回0虽然我也应该正确转换。这就是功能。

struct coin * addCoins(char *val){
    char *ptr =NULL;
    long int denomination = strtol(val, &ptr,10);
    long int count = strtol( &ptr,NULL, 10);
        printf("%d",count);
    struct coin *k;
    k = malloc(sizeof(struct coin));
    k->denom = denomination;
    k->count = count;
    return k;
}

这将返回用于硬币面额的长整数,然后将多少个硬币存储在硬币类型的结构中。其中有以下内容typedef

/* Each coin in the coins array will have a denomination (20 cents, 
 * 50 cents, etc) and a count - how many of that coin do we have on hand
 */
struct coin
{
    enum denomination denom;
    unsigned count;
};

读取文件的格式如下。第一列是面额,第二列是计数

1000,3
500,4
200,20
100,30
50,5
20,3
10,40
5,20

分隔符是逗号。我们专门告诉我们使用strtol,否则我会使用strtok_r

用户名

您的验证码

long int denomination = strtol(val, &ptr,10);
long int count = strtol( &ptr,NULL, 10);

第二行有一些问题。

第一个参数&ptr应该简单地是ptr那是因为strtol想要一个简单的指向char的指针作为它的第一个参数。因此,尽管“&”号在第一个调用中strtol是正确的,但在第二个调用中是不正确的。

问题二是endptrstrtol返回的第一个字符不属于第一个数字。换句话说,它指向逗号。由您自己决定将指针越过逗号。

这就带来了另一个问题。在指针经过逗号之前,您必须确保它确实指向了逗号。如果不是,则表示存在问题,并且您必须优雅地失败。由于您的函数返回了一个指针,因此您应该返回NULL以指示发生了错误。

因此,您的功能应该是

struct coin * addCoins(char *val)
{
    char *ptr;
    long int denomination = strtol( val, &ptr, 10 );
    if ( ptr == val || *ptr != ',' )   // verify that we found the comma
        return NULL;
    ptr++;                             // advance the pointer past the comma

    char *endptr;
    long int count = strtol( ptr, &endptr, 10 );
    if ( endptr == ptr || *endptr != '\0' )   // verify that the second conversion succeeded
        return NULL;

    struct coin *k;
    k = malloc(sizeof(struct coin));
    k->denom = denomination;
    k->count = count;
    return k;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章