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 независимо от ввода.
Я очень смущен. Что происходит?
Ответы
Ответ 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(), который я предпочитаю из-за его поведения обнаружения ошибок.