Char не конвертируется в int

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

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] и вместо этого использовать first для преобразования, и это достаточно странно дало мне 17 независимо от ввода.

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


person limasxgoesto0    schedule 19.03.2012    source источник
comment
Я думаю, вы могли иметь в виду argv[1][0] (тип char) ‹-- первый символ первого аргумента (после имени исполняемого файла). Конечно, с этим все равно не проверить, и есть способы получше. Не пытайтесь отбросить ошибку (поскольку argv[1] печатается как char*), потому что это часто просто не работает :-)   -  person    schedule 20.03.2012


Ответы (4)


argv[1] — это char *, а не 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
person twain249    schedule 19.03.2012
comment
Вы упомянули atoi... почему? - person FrankieTheKneeMan; 20.03.2012
comment
@FrankieTheKneeMan Я никогда не использовал atoi. вы можете использовать его, если хотите, но в моем ответе его никогда не было. Однако ответ Скотта Хантера использует его. - person twain249; 20.03.2012
comment
Почему вам пришлось сделать int i = (int)(argv[1][0] - '0');, а не int i = (int)(argv[1][0]);? Зачем нужно было - '0'? - person nonsequiter; 27.10.2015
comment
Потому что, если ваш первый символ — «1», 1 в ascii — это 49, поэтому приведение вернет 49. Вы хотите вычесть первую цифру («0» в ascii — это 48), а затем выполнить приведение, чтобы получить правильный ответ. - person pushkin; 01.11.2015

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

person Scott Hunter    schedule 19.03.2012
comment
Это должен быть выбранный ответ. - person RyanB; 29.07.2013
comment
Это прямо здесь. Для этого была создана функция atoi(). - person Loi Huynh; 17.08.2016

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

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

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

person Stefan Marinov    schedule 19.03.2012
comment
На самом деле предполагается, что массив char, на который указывает char *, заканчивается на '\0'. Оканчивается ли указатель на '\0' (что бы это значило в любом случае? что его представление оканчивается на 0 байт?) не является проблемой. - person R.. GitHub STOP HELPING ICE; 20.03.2012
comment
Конечно. Предложение указатель на char заканчивается определенным символом просто не имеет смысла. Спасибо за исправление. :) - person Stefan Marinov; 20.03.2012

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

['5']['0']

когда ты бросаешь

int i = (int) *argv[1]

вы только переводите первый элемент в int, поэтому вы

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

person FrankieTheKneeMan    schedule 19.03.2012