Как преобразовать строку в целое число без пробелов? - PullRequest
1 голос
/ 31 мая 2019

Я пытаюсь умножить комплексные числа, введенные пользователем.Вот некоторые примеры ввода:

Введите комплексное число в форме ai + b: 2i + 8

Введите комплексное число в форме ai + b: 11 i + 2

Введите комплексное число в форме ai + b: 1i + 6

Я хочу, чтобы все они были действительными вводами, но я не уверен, как убедиться, что scanf () игнорирует пробелы и символы так, чтобыЯ могу просто извлечь целые числа.Я пытаюсь сделать это, используя scanf (), принимающий входные данные как три строки с первой строкой, содержащей ai, второй строкой, содержащей '+', и третьей строкой, содержащей b.Однако мой код, пытающийся превратить мою первую строку (с ai) в целое число (просто a без 'i'), не увенчался успехом.

int inta(char* ai){
  int i;
  int origa;
  int max;
  int a = 0;
  for(i = 0; i<strlen(ai); i++){
    if(ai[i] != "i" && ai[i] != ' ')
      continue;
    else
      break;
  }
  if(i > 1)
    for(max = i; max > 0; max--){
      origa = atoi(ai[max])*pow(10, max);
      a = origa + a;
    }
  else
    a = atoi(ai[0]);
  return a;
}

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Для извлечения a из строки ai+b даже с пробелом между значением a и 'i' просто используйте sscanf и проверьте его возвращает 1, чтобы убедиться, что вы прочитали int

И, наконец, также извлечь оператор и b просто сделать

sscanf(argv[1], "%d i %c %d", &a, &oper, &b)

и проверьте, что он возвращает еще 3 oper действительно, например:

#include <stdio.h>

int main(int argc, char ** argv)
{
  int a, b;
  char oper;

  if (argc != 2)
    printf("Usage: %s <ai+b>\n", *argv);
  else if ((sscanf(argv[1], "%d i %c %d", &a, &oper, &b) == 3)
           && ((oper == '+') || (oper == '-')))
    printf("a=%d b=%d oper=%c\n", a, b, oper);
  else
    puts("invalid input");

  return 0;
}

Компиляция и исполнения:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out ai+2
invalid input
pi@raspberrypi:/tmp $ ./a.out 12i+3
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12i + 3"
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12 i + 3"
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12 i - 3"
a=12 b=3 oper=-
pi@raspberrypi:/tmp $ ./a.out "12i+-3"
a=12 b=-3 oper=+
pi@raspberrypi:/tmp $ ./a.out "-12i+-3"
a=-12 b=-3 oper=+
pi@raspberrypi:/tmp $ ./a.out "-12i*-3"
invalid input
pi@raspberrypi:/tmp $ 

Примечание. Я разрешаю вводить 1i-2 напрямую, а не заставлять вводить 1i+-2 менее практично, поскольку я позволяю оператору указывать '-', если вы не хотите разрешить эту упрощенную форму:

#include <stdio.h>

int main(int argc, char ** argv)
{
  int a, b;

  if (argc != 2)
    printf("Usage: %s <ai+b>\n", *argv);
  else if (sscanf(argv[1], "%d i + %d", &a, &b) == 2)
    printf("a=%d b=%d\n", a, b);
  else
    puts("invalid input");

  return 0;
}

Компиляция и исполнения:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out ai+2
invalid input
pi@raspberrypi:/tmp $ ./a.out 12i+3
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12i + 3"
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12 i + 3"
a=12 b=3 oper=+
pi@raspberrypi:/tmp $ ./a.out "12 i - 3"
invalid input
pi@raspberrypi:/tmp $ ./a.out "12i+-3"
a=12 b=-3 oper=+
pi@raspberrypi:/tmp $ ./a.out "-12i+-3"
a=-12 b=-3 oper=+
pi@raspberrypi:/tmp $ ./a.out "-12i*-3"
invalid input
pi@raspberrypi:/tmp $ ./a.out "-12i++3"
a=-12 b=3 oper=+
pi@raspberrypi:/tmp $ 

О вашем обновлении, ваши входные строки для sscanf недействительны, потому что вы даете NULL-указатели, вы хотите что-то вроде этого:

#include <stdio.h>

int main()
{
  char line[64];
  int a;
  int b;
  int c;
  int d;
  int finala;
  int finalb;

  printf("Enter the first complex number in the form ai + b: ");

  if ((fgets(line, sizeof(line), stdin) == NULL) ||
      (sscanf(line, "%d i + %d", &a, &b) != 2)) {
    puts("invalid form");
    return -1;
  }

  printf("Enter the second complex number in the form ai + b: ");
  if ((fgets(line, sizeof(line), stdin) == NULL) ||
      (sscanf(line, "%d i + %d", &c, &d) != 2)) {
    puts("invalid form");
    return -1;
  }

  finala = b*c + a*d;
  finalb = b*d + a*c*(-1);

  printf("(%di + %d) * (%di + %d) = %di + %d\n", a, b, c, d, finala, finalb);
}

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
Enter the first complex number in the form ai + b: 1i+2
Enter the second complex number in the form ai + b: -2i+6
(1i + 2) * (-2i + 6) = 2i + 14
pi@raspberrypi:/tmp $ 
0 голосов
/ 31 мая 2019

UPDATE


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



    char* erase(char*str, int index)
    {
        int i = index;
        while (str[i] != '\0')
        {
            str[i] = str[i + 1];
            i++;
        }
        return str;
    }
    char* remove_spaces(char* str)
    {
        int i = 0;
        while (str[i] != '\0')
        {
            if (str[i] == ' ' || str[i] == '\t' || str[i] == '\n')
            {
                erase(str, i);
                i--;
            }
            i++;

        }
        return str;
    }

Тогда для любого символа, который вы хотите преобразовать в int, вы можете вычесть из него '0'.


Попробуйте этот код


    int x;
    x='5'-'0'
    printf("%d",x);

Выход для этого будет целочисленное значение = 5.


В вашем случае первая строка имеет (ai), поэтому, если вы хотите преобразовать ее в число, вы можете просто выбрать первый символ «ie: str [0]» и вычесть из него «0».

или вы можете использовать мою пользовательскую функцию для преобразования любой строки в целое число, но вы должны проверить, что строка содержит только цифры перед вызовом этой функции, а также передать адрес целого числа, в котором вы хотите, чтобы он содержал результат.


например:


    void convert_to_int(char*str,int*result)
    {
        int i=strlen(str)-1;
        *result = 0;
        int factor = 1;
        while (i >= 0)
        {
            (*result) += (str[i]-'0') * factor;
            factor *= 10;
            i--;
        }
    }
    int main()
    {
    int x;
    convert_to_int(str,&x);
    return 0;
    }

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