因此,我很好奇为什么下面的代码段一直存在分段错误。在我看来是对的。
int * addCoins(char *val){
const char *deli = ",";
char *ptr =NULL;
char *denomination = strtok_r(val, deli, &ptr);
char *count = strtok_r(NULL, deli, &ptr);
int deno = atoi(denomination);
int cnt = atoi(count);
int *k;
k = malloc(sizeof(*k)*2);
k[0] = deno;
k[1] =cnt;
return k;
}main中对函数addCoins的调用。我不认为这是错在这里,但老实说,我在这个问题上有点不知所措。
char* fileNameCoin = argv[2];
FILE *fileCoin;
fileCoin = fopen(fileNameCoin, "r+");
char bufCoin[256];
int i = 0;
//vmNode->next = NULL;
int *j;
while (fgets(bufCoin, sizeof bufCoin, fileCoin) != NULL) {
j = addCoins(bufCoin);
int deno = j[0];
switch(deno){
case 5:
Coins[i].denom = j[0];
Coins[i].count = j[1];
break;
case 10:
Coins[i].denom = j[0];
Coins[i].count = j[1];
break;
case 20:
Coins[i].denom = j[0];
Coins[i].count = j[1];
break;
case 50:
Coins[i].denom = j[0];
Coins[i].count = j[1];
break;
case 100:
Coins[i].denom = j[0];
Coins[i].count = j[1];
break;
case 200:
Coins[i].denom = j[0];
Coins[i].count = j[1];
break;
case 500:
Coins[i].denom = j[0];
Coins[i].count = j[1];
break;
case 1000:
Coins[i].denom = j[0];
Coins[i].count = j[1];
break;
default:
break;
}
i++;
}以下是文件的定义方式
1000,3 500,4 200,20 100,30 50,5 20,3 10,40 5,20
其中第一个数字是以美分为单位的面额,第二列是所述面额的数目。
这些是类型:
/* The different denominations of coins available */
enum denomination
{
FIVE_CENTS, TEN_CENTS, TWENTY_CENTS, FIFTY_CENTS, ONE_DOLLAR,
TWO_DOLLARS, FIVE_DOLLARS, TEN_DOLLARS
};
/* 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;
};发布于 2014-10-06 13:49:25
strtok()/strtok_r()的第二个参数通过期望char的0-terminated数组(即C-"string“)来描述分隔符的集。
来自's man-page
delim参数指定一组字节,用于分隔已解析字符串中的标记。
因此,它的用法应是:
const char deli[2] = {',', '\0'};
...
char * denomination = strtok_r(val, deli, &ptr);或者更直截了当:
const char deli[] = ",";
...
char * denomination = strtok_r(val, deli, &ptr);或者直接删除deli的定义,然后做:
char * denomination = strtok_r(val, ";", &ptr);此外,代码还应该检查对strtok_t()的调用在将结果传递给atoi()之前是否返回了NULL,因为如果给NULL喂食,atoi()将很不幸地失败。
https://stackoverflow.com/questions/26217537
复制相似问题