我试图乘以用户输入的复数。一些示例输入为:
以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;
}
答案 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 $