首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分段故障难题

分段故障难题
EN

Stack Overflow用户
提问于 2014-10-06 13:41:12
回答 1查看 89关注 0票数 1

因此,我很好奇为什么下面的代码段一直存在分段错误。在我看来是对的。

代码语言:javascript
复制
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的调用。我不认为这是错在这里,但老实说,我在这个问题上有点不知所措。

代码语言:javascript
复制
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

其中第一个数字是以美分为单位的面额,第二列是所述面额的数目。

这些是类型:

代码语言:javascript
复制
    /* 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;
    };
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-06 13:49:25

strtok()/strtok_r()的第二个参数通过期望char0-terminated数组(即C-"string“)来描述分隔符的

来自's man-page

delim参数指定一组字节,用于分隔已解析字符串中的标记。

因此,它的用法应是:

代码语言:javascript
复制
const char deli[2] = {',', '\0'};
...
char * denomination = strtok_r(val, deli, &ptr);

或者更直截了当:

代码语言:javascript
复制
const char deli[] = ",";
...
char * denomination = strtok_r(val, deli, &ptr);

或者直接删除deli的定义,然后做:

代码语言:javascript
复制
char * denomination = strtok_r(val, ";", &ptr);

此外,代码还应该检查对strtok_t()的调用在将结果传递给atoi()之前是否返回了NULL,因为如果给NULL喂食,atoi()将很不幸地失败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26217537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档