因此,我对为什么内置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
是正确的,但在第二个调用中是不正确的。
问题二是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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句