我想将给定字符串中的数字乘以一个或多个空格。
示例:
如果我输入
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 :(得分: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;
}