О том, что осталось после запуска strtol - PullRequest
0 голосов
/ 09 февраля 2019

У меня проблемы с пониманием поведения strtol() в C. Например, когда я тестирую строку " 4396", если у меня есть:

char *test = " 4396";
char *ptr;
int result = strtol(test, &ptr, 10);
printf("%d\n", result);
printf("%d\n", strlen(ptr));

Вывод:

4396
//not 0

Мне просто интересно, почему длина не 0, так как я уже проверил до конца?

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

следующий предложенный код:

  1. безупречная компиляция
  2. выполняет желаемую функциональность
  3. обратите внимание на исправления нескольких операторов
  4. обратите внимание на добавлениеиз заголовочных файлов
  5. обратите внимание на добавление функции: main()
  6. в программировании, количество деталей

и теперь предлагаемый код:

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

int main( void )
{
    char* test = " 4396";
    char *ptr;
    long result = strtol(test,&ptr,10);  // note the change from `int` to `long`
    printf("%ld\n",result);  // note the change from'%d' to '%ld'
    printf("%zu\n",strlen(ptr)); // note the change from '%d' to '%zu'
}

вывод предлагаемого кода:

4396
0

Обратите внимание, что вторым выводом является 0, поскольку strlen() не считает завершающий байт NUL и ptr указывает на байт NUL

0 голосов
/ 09 февраля 2019

strtol() хранит указатель на символ после последней цифры в " 4396", следовательно, указатель на нулевой терминатор этой строковой константы.

Длина строки C, на которую указывает ptr is 0, возвращаемое strlen() с типом size_t.

Очень удивительно, что нет вывода для оператора printf("%d\n", strlen(ptr));.Вот некоторые подсказки:

  • Одно из возможных объяснений: strlen() возвращает size_t, и вы передаете это в качестве аргумента для %d, который ожидает int.Передача несовместимого типа, такого как size_t, который может иметь другой размер, имеет неопределенное поведение.Вы должны либо использовать спецификацию преобразования C99 printf("%zu\n", strlen(ptr));, либо преобразовать длину в unsigned long для переносимости в устаревшие библиотеки C: printf("%lu\n", (unsigned long)strlen(ptr));

  • Другое возможное объяснение: вы не включили <string.h> и strlen() выводят тип возвращаемого значения int, который отличается от фактического возвращенного типа ... Неопределенное поведение.

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

  • Последнее, но не менее важное: вы исправили код в первоначальном сообщении и сделали вопрос неуместным.ptr был неинициализированным указателем, переход к strlen() имел неопределенное поведение, вероятно, вызывало остановку программы, что объясняло бы, почему вы не получили никакого вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...