在C中的strtok并传递参数

时间:2013-03-23 00:54:19

标签: c arrays pointers strtok

我有一个函数,其目的是接收一个由空格分隔的数字数组,一次一个数字,将它们分配给结构的变量,如下所示:

typedef struct coo {
    int x;
    int y;
} Coord;

typedef struct exer {
    Coord coords[1000];
} exercise;


int coordinates(char *sent){
    char * pal;
    int k=0;
    pal = strtok (sent," ");
    while (pal != NULL)
    {
        exercise.coords[k].x=*pal;
        pal = strtok (NULL," ");
        exercise.coords[k].y=*pal;
        pal = strtok (NULL," ");
        k++;
    }
    return 1;
}

问题是稍后打印的坐标与发送时的指示不同。

如果我输入坐标1 2 3 4 5 6,它将给出坐标49 50 51 52 53。

提前谢谢。

2 个答案:

答案 0 :(得分:6)

这是因为您获得了第一个字符的值。您获得的值49是字符'1'的ASCII值。

您必须将字符串转换为数字,例如strtol

答案 1 :(得分:0)

在阐述Joachim Pileborg的回答时,pal是指向一个角色的指针。 *palchar,它是一个整数值,表示pal指向的字符。 char ,是整数的最小可寻址类型。

如果您要使用strtol,最明智的做法是将coords更改为long,以便类型匹配。好处是strtok在这种解析方面非常糟糕,你可以完全抛弃它。

typedef struct {
    long x;
    long y;
} Coord;

/* returns the number of coordinates read. */
size_t read_coordinates(char *str, Coord destination[], size_t capacity);

int main(void) {
    #define EXERCISE_CAPACITY 1000
    Coord exercise[EXERCISE_CAPACITY];
    size_t count = read_coordinates("1 2 3 4 5 6", exercise, EXERCISE_CAPACITY);
}

size_t read_coordinates(char *str, Coord destination[], size_t capacity) {
    size_t x;
    for (x = 0; x < capacity; x++) {
        char *endptr = NULL;
        destination[x].x=strtol(str, &endptr, 10);
        if (endptr - str == 0) {
            // Stop when strtol says it can't process any more...
            break;
        }
        str = endptr + 1;

        destination[x].y=strtol(str, &endptr, 10);
        if (endptr - str == 0) { break; }
        str = endptr + 1;
    }
    return x;
}

如果你必须使用int作为你的坐标的类型,那么使用sscanf是明智的,有点像这样:

typedef struct {
    int x;
    int y;
} Coord;

/* returns the number of coordinates read. */
size_t read_coordinates(char *str, Coord destination[], size_t capacity);

int main(void) {
    #define EXERCISE_CAPACITY 1000
    Coord exercise[EXERCISE_CAPACITY];
    size_t count = read_coordinates("1 2 3 4 5 6", exercise, EXERCISE_CAPACITY);
}

size_t read_coordinates(char *str, Coord destination[], size_t capacity) {
    size_t x;
    for (x = 0; x < capacity; x++) {
        int n;
        if (sscanf(str, "%d %d%n", &destination[x].x, &destination[x].y, &n) != 2) {
            // Stop when sscanf says it can't process any more...
            break;
        }
        str += n;
    }
    return x;
}