strtol帮助为什么它返回0

时间:2014-10-16 04:16:35

标签: c struct strtol

所以我很困惑为什么内置的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

2 个答案:

答案 0 :(得分:1)

您的代码

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

第二行存在一些问题。

第一个参数&ptr应该只是ptr。那是因为strtol想要一个简单的指针指向char作为它的第一个参数。因此,虽然第一次调用strtol时&符号是正确的,但在第二次调用中它是不正确的。

问题二是从endptr返回的strtol指向第一个不属于第一个数字的字符。换句话说,它指向逗号。你可以通过逗号来推进指针。

然后引入另一个问题。在将指针推进逗号之前,您必须确保它实际上指向逗号。如果它没有,那么有些不对劲,你必须优雅地失败。由于函数返回指针,因此应返回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;
}

答案 1 :(得分:0)

我提出的解决方案是在传递给strtol之前对字符串进行标记,但是想象一下有一种更优雅的方式来执行此操作。

char *ptr =NULL;
char *ptrs =NULL;
const char *deli = ",";
char *denominations = strtok_r(val, deli, &ptrs);
char *counts = strtok_r(NULL, deli, &ptrs);

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