c струнная версия Atoi - PullRequest
       2

c струнная версия Atoi

0 голосов
/ 01 ноября 2010

есть ли такие функции, как atoi читать буфер для возврата строки?

fgets(input, data_len, stdin);
return atoi(input + 6); // i need the string

спасибо

полный код

char *getInput2(char *param) {
    data_len=atoi(getenv("CONTENT_LENGTH"));
    char input[data_len];
    fgets(input, data_len, stdin);

    char *r_str;
    strcpy (r_str, input+6);

    return r_str;
}

наконец, внутренняя ошибка сервера ........

char *getInput2(char *param) {

    char input[100];
    data_len=sizeof(input);
    fgets(input, data_len, stdin);


    return strdup (input+7);
}

только может вернуть первый символ ...... введите 12 только вернуть 1, в чем проблема?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2010

Я не совсем уверен, что вы спрашиваете, но если это как получить строковое представление целого числа со смещением 6, вы можете сделать это в два этапа:

char str[enough_to_hold_datalen_and_then_some];
int val = atoi (input+6);
sprintf (str, "%d", val);

В качестве альтернативы, если вы хотите получить фрагмент строки независимо от того, состоит ли он из цифр:

strcpy (str, input+6);                      // get the rest of the string
strncpy (str, input+6, 4); str[4] = '\0';   // get up to four characters.

Если ваша проблема в том, что вход является локальной переменной для функции и, когда вы возвращаете ее адрес, вы получаете фиктивные данные, потому что они вышли из области видимости, я бы использовал:

return strdup (input+6);

Это вернет копию строки в куче (которая является долгоживущей, а не стековым фреймом, которого нет).

Просто помните, что вам нужно free эту память, когда вы закончите с ней. И будьте уверены, что у вас на самом деле есть шесть символов в этом буфере.

Если ваша реализация C не имеет strdup, используйте этот .


Судя по твоему обновлению, похоже, что ты выбрал последний вариант. С вашим кодом:

char *r_str;
strcpy (r_str, input+6);
return r_str;

вы на самом деле не выделяете хранилище для размещения копии строки (следовательно, происходит сбой). Я бы заменил весь этот бит на простой:

return strdup (input+6);

как я и предлагал.


Ха, ха, должен любить этих писателей страниц Linux :

Если строка назначения функции strcpy () недостаточно велика (то есть, если программист был глуп или ленив и не смог проверить размер перед копированием), тогда может произойти что угодно. Переполнение строк фиксированной длины является любимой техникой взломщика.

0 голосов
/ 01 ноября 2010

Если вы хотите вернуть строку, то atoi не имеет к ней никакого отношения. Вместо этого ваша проблема заключается в том, что вы не можете вернуть память локальной переменной. Возвращать память на C всегда сложно; как правило, вы возвращаете динамически выделенную память и ожидаете, что вызывающая сторона освободит ее:

char* get_value()
{
    char input[100];
    int data_len = sizeof(input);
    char *result;
    fgets(input, data_len, stdin);
    result = malloc(strlen(input)-5); /* reserve enough memory, including the terminating NUL */
    strcpy(result, input+6);
    return result;
}

(вы можете сократить это, используя strdup)

В качестве альтернативы, вы можете использовать глобальную переменную, но она не будет реентерабельной:

char input[100];
char* get_value()
{
    int data_len = sizeof(input);
    fgets(input, data_len, stdin);
    return input+6;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...