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