如何将字符串转换为没有空格的整数?

时间:2019-05-31 07:36:09

标签: c

我试图乘以用户输入的复数。一些示例输入为:

以ai + b的形式输入复数:2i + 8

以ai + b的形式输入复数:11 i + 2

以ai + b的形式输入复数:1i + 6

我希望所有这些都是有效的输入,但是不确定如何确保scanf()忽略空格和字符,以便我可以提取整数。我试图通过让scanf()将输入作为三个字符串来接受,其中第一个字符串包含ai,第二个字符串包含'+',第三个字符串包含b。但是,我的代码试图将我的第一个字符串(带有ai)转换为整数(只是一个没有'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 :(得分:0)

更新


好,尝试这两个函数从任何字符串中删除空格。



    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),因此,如果要将其转换为数字,则只需选择第一个字符“即: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;
    }

答案 1 :(得分:0)

要从字符串ai+b中提取 a ,即使 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不太实用,因为如果您不希望使用这种简化形式,我允许运算符为'-':< / p>

#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 $