Подтвердить что ты не робот

Char не преобразовывается в int

По какой-то причине моя программа C отказывается преобразовывать элементы argv в ints, и я не могу понять, почему.

int main(int argc, char *argv[])
{

    fprintf(stdout, "%s\n", argv[1]);

    //Make conversions to int
    int bufferquesize = (int)argv[1] - '0';

    fprintf(stdout, "%d\n", bufferquesize);
}

И это результат при запуске. /test 50:

50

-1076276207

Я попытался удалить (int), выбрасывая как *, так и между (int) и argv [1] - первый дал мне 5, но не 50, но последний дал мне результат, аналогичный тому, выше. Удаление операции "0" не очень помогает. Я также попытался сделать char first = argv [1] и сначала использовать для преобразования, и это довольно странно дало мне 17 независимо от ввода.

Я очень смущен. Что происходит?

4b9b3361

Ответ 1

argv[1] - это char * не a char, вы не можете преобразовать char * в int. Если вы хотите изменить первый символ в argv [1] на int, который вы можете сделать.

int i = (int)(argv[1][0] - '0');

Я только что написал это

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

int main(int argc, char **argv) {
    printf("%s\n", argv[1]);

    int i = (int)(argv[1][0] - '0');

    printf("%d\n", i);
    return 0;
}

и запускал его следующим образом

./testargv 1243

и получил

1243
1

Ответ 2

Попробуйте использовать atoi(argv[1]) ( "ascii to int" ).

Ответ 3

Вы просто пытаетесь преобразовать char* в int, что, конечно, не имеет большого смысла. Вам, вероятно, нужно это сделать:

int bufferquesize = 0;
for (int i = 0; argv[1][i] != '\0'; ++i) {
   bufferquesize *= 10; bufferquesize += argv[1][i] - '0';
}

Это предполагает, однако, что ваш char* заканчивается на '\ 0', который он должен, но, вероятно, не нужно делать.

Ответ 4

(type) существует, чтобы создавать типы - чтобы изменить способ просмотра части памяти. В частности, он считывает байтовую кодировку символа "5" и передает его в память. A char * - массив символов, а символы - это однобайтовые целые числа без знака. argv[1] указывает на первый символ. Проверьте здесь для быстрого объяснения указателей на C. Таким образом, ваша "строка" представлена ​​в памяти как:

['5']['0']

при нажатии

int i = (int) *argv[1]

вы только набрасываете первый элемент на int, поэтому вы

Функция, которую вы ищете, - это atoi(), как упоминалось Скоттом Хантером, или strtol(), который я предпочитаю из-за его поведения обнаружения ошибок.