Преобразуйте char в int в C, а затем напечатайте значение как int? - PullRequest
0 голосов
/ 07 февраля 2019

Я продолжаю получать эти странные отрицательные значения, когда запускаю код.Кто-нибудь знает, кто они и как получить только int (например, 10, 20, 8 ...)?Почему я всегда получаю другое и неправильное значение?Когда я запускаю код с аргументами 2 и 3, он должен вывести 10 ...

int main(int argc, char *argv[]) {
  int h;
  int a;
  int b;
  a = (int) argv[1];
  b = (int) argv[2];
  if (argc == 3) {
    h = 2 * (a + b);
    printf("The perimeter of the rectangle is %d\n", h);
  } else {
    fprintf(stderr, "Usage: %s <arguments>\n", argv[0]);
  }
}

Output:
The perimeter of the rectangle is -1874251136
or
The perimeter of the rectangle is -1424723328
or
The perimeter of the rectangle is -940059169

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019
b = (int)argv[2]

(int) является приведением значения указателя - он просто преобразует тип

Вместо этого попробуйте использовать atoi или strtol для преобразования строки в целочисленное значение.

0 голосов
/ 07 февраля 2019

Тест слишком поздний

if(argc==3){ тесты для обязательных argc, но, к сожалению, после использования argv[1], argv[2].Передвиньте тест до и выйдите, если не нужно.Примечание: хорошее использование сообщения об ошибке для stderr.

if (argc != 3) {
  fprintf(stderr,"Usage: %s <arguments>\n", argv[0]);
  return -1; // or return EXIT_FAILURE
}  

Неправильное преобразование

Код преобразует указатель, а не ссылочный текст.

#include <stdlib.h>

// a = (int)argv[1];
a = atoi(argv[1]);

Надежный код будет использовать strtol() или, возможно, свернуть свой собственный `strtoi () '

0 голосов
/ 07 февраля 2019

argv - это массив указателей на char.Т.е. это массив строк .Строка "1" равна , а не и равна целому числу 1 (или даже символу '1').Факт, что вы выполняете приведение, почти всегда должен быть красным флагом.

Чтобы преобразовать строку в число, используйте функцию strtol.

Ивсегда не забывайте проверять argc до доступа к argv.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...