乘以字符串的数字

时间:2017-07-08 16:31:05

标签: c

我想将给定字符串中的数字乘以一个或多个空格。

示例:

  

如果我输入52 26 23
  输出应为31096

我已经编写了这段代码,但它无效:

#include <stdio.h>

int main()
{
    char input[30];
    int i, num = 0, v = 1;
    gets(input);

    for (i = 0; input[i] != '\0'; i++)
    {
        if(input[i] == 32)
        {
            v = v * num;
            if(input[i+1] != 32)
            {
                num = 0;
                continue;
                }
            }
            num = (num * 10) + (input[i] - 48);
    }

    printf("%d",v);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

  

试试这个

#include <stdio.h>
#include <string.h>
int main()
{
    char str[30];
    char *token;
    long int mul = 1;
    gets(str);
    token  = strtok(str, " ");
    while (token != NULL)
    {
        mul = mul * atoi(token);
        token = strtok(NULL, " ");
    }
    printf("%ld",mul);
    return 0;
}

答案 1 :(得分:-1)

问题在于嵌套的if语句。一旦它进入第一个if语句,这意味着input[i]==32,因此它永远不会进入input[i]!=32的下一个if语句。

我也有一些提高可读性的建议。不使用数字来表示字符,而是使用字符文字本身!

另外,在input缓冲区中只有30个字符的空格。如果用户尝试输入的数量超过此值,则会出现缓冲区溢出。

最后,如果用户在数字之间放置多个空格,则输出将变为0.这可能是您可能想要或可能不想处理的事情。

编辑:之前,对gets的调用只抓取第一个空格字符的字符。我在调用scanf时使用格式字符串修复了此问题。缓冲区溢出问题仍然适用。此外,它没有与最后解析的整数相乘,所以我在循环后添加了代码。另一个注意事项,这只适用于非负整数,如果这是你最初没有意识到的东西。代码只是假设输入很好。

修改2:支持输入之前,之间或之后的任意数量的空格。

#include <stdio.h>

int main() {
  char input[30];
  int i, num = 0, v = 1;

  scanf("%[^\n]s", input);

  // skip leading spaces
  for(i = 0; input[i] == ' '; i++);

  // parse remaining input
  while(input[i] != '\0') {
    if(input[i] == ' ') {
      v *= num;
      num = 0;
      // skip subsequent spaces
      while(input[++i] == ' ');
      continue;
    }

    num *= 10;
    num += input[i] - '0';
    i++;
  }

  // ignore trailing spaces
  if(input[i - 1] != ' ') {
    // get last parsed integer
    v *= num;
  }

  printf("%i\n", v);
  return 0;
}
相关问题