2017-07-08 79 views
-2

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

实施例:

如果我输入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; 
} 
+0

是学术的目的或者是你可以使用预定义的功能呢? –

+1

你认为内部if语句块何时执行?使用调试器或放置'printf'语句并检查。 – babon

+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; 
} 
+0

使用一个空格 –

+0

感谢它的工作。 –

-1

问题就出在你的嵌套的if语句。一旦进入第一条if语句,即表示input[i]==32,因此它永远不能进入下一条if语句,其中input[i]!=32

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

另一件事,您的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; 
} 
+0

您的代码不会计算给定输入的预期结果。 – deamentiaemundi

+0

谢谢,作出更改! – kamoroso94

+0

为什么downvote? – kamoroso94