Преобразование строки в long с использованием strtol и указателей

Моя цель - преобразовать строку, такую ​​как "A1234" к long со значением 1234, Моим первым шагом было просто преобразовать "1234" к longи это работает как ожидалось:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
    char* test = "1234";
    long val = strtol(test,NULL,10);
    char output[20];
    sprintf(output,"Value: %Ld",val);
    printf("%s\r\n",output);
    return 0;
}

Теперь у меня проблемы с указателями и пытаюсь игнорировать A в начале строки. я пытался char* test = "A1234"; long val = strtol(test[1],NULL,10); Однако это приводит к сбою программы.

Как мне установить это правильно, чтобы он указывал на правильное место?

1 ответ

Решение

Вы почти правы. Вам нужно передать указатель на strtol, хоть:

long val = strtol(&test[1], NULL, 10);

или же

long val = strtol(test + 1, NULL, 10);

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

example.c:6:23: warning: incompatible integer to pointer conversion passing
      'char' to parameter of type 'const char *'; take the address with &
      [-Wint-conversion]
    long val = strtol(test[1],NULL,10);
                      ^~~~~~~
                      &
/usr/include/stdlib.h:181:26: note: passing argument to parameter here
long     strtol(const char *, char **, int);
                            ^
1 warning generated.

и из GCC:

example.c: In function ‘main’:
example.c:6: warning: passing argument 1 of ‘strtol’ makes pointer from integer 
without a cast

От редакции. Думаю, из этих сообщений об ошибках видно, почему новичкам часто рекомендуется использовать Clang, а не GCC.

Другие вопросы по тегам