6

このコードは期待どおりに動作するようで、単一のポインターを使用して数値の配列を設定します

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

int main(void)
{
    int arr[4], count = 0, i;
    char *p, s[32] = "  \t  10,  15  \n  ,20,   25  , ";

    p = s;
    do {
        arr[count++] = (int)strtol(p, &p, 10);
        while (isspace(*p) || *p == ',') p++;
    } while (*p);
    for (i = 0; i < count; i++) {
        printf("%d\n", arr[i]);
    }
    return 0;
}

私の質問は:

strtol で p を param1 (ソース) として使用し、&p を param 2 (最初の無効な文字のアドレス) として使用することは有効ですか?

4

3 に答える 3

6

はい、安全です。最初の引数は値で渡されるためstrtol、2 番目のパラメーターに書き込まれた変更の影響を受けないローカル コピーがあります。

于 2012-12-19T12:16:27.570 に答える
1

はい、安全です。

完全な使用法については、 http://en.cppreference.com/w/cpp/string/byte/strtolを参照してください。この例の 11 行目は、1 番目と 2 番目のパラメーターに同じ変数を使用した呼び出しを示しています。

于 2012-12-19T12:10:37.183 に答える
1

はい、文字列の先頭へのポインター (ポインター s) を保持しているため、これは有効です。次のような状況があるとします。

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int arr[4], count = 0, i;
    char *p, *s;
    s = (char*)malloc(sizeof(char) * 15);
    strcpy(s, "  \t  10,  15  \n  ,20,   25  , ");

    p = s;
    do {
        arr[count++] = (int)strtol(p, &p, 10);
        while (isspace(*p) || *p == ',') p++;
    } while (*p);
    for (i = 0; i < count; i++) {
        printf("%d\n", arr[i]);
    }
    free(s);
    return 0;
}

strtolp ポインターを文字列内のどこかに移動します。呼び出すfree(p)と、メモリ リークが発生します (失敗しない場合)。ただし、ポインタを保持しているため、占有されているメモリをいつでも解放できます。

于 2012-12-19T12:06:08.647 に答える