Char не конвертируется в int - PullRequest
10 голосов
/ 20 марта 2012

По какой-то причине моя 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 независимо от ввода.

Я в замешательстве.Что происходит?

Ответы [ 4 ]

52 голосов
/ 20 марта 2012

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

12 голосов
/ 20 марта 2012

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
3 голосов
/ 20 марта 2012

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

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

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

2 голосов
/ 20 марта 2012

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

['5']['0']

, когда вы произносите

int i = (int) *argv[1]

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

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

...