0

スペースで区切られた数値の配列を受け取ることを目的とする関数があり、一度に1つの数値を次のような構造体の変数に割り当てます。

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 が返されます。

前もって感謝します。

4

2 に答える 2

6

これは、最初の文字の値を取得するためです。49取得する値は、文字の ASCII 値です'1'

文字列を数値に変換する必要がありますstrtol

于 2013-03-23T00:58:09.687 に答える
0

Joachim Pileborgの答えを詳しく説明palすると、キャラクターへのポインターです。*palこれはchar、pal が指す文字を表す整数値です。charは、アドレス可能な最小の整数型です。

strtol を使用する場合は、型が一致するようcoordsに toを変更するのが最も賢明です。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;
}
于 2013-03-23T02:14:09.733 に答える