读取C中的分数
如何读取C中的分数来进行数学运算? (该分数将包含斜杠符号)例如,用户将输入3/12。 (一个字符串)程序将找到gcd,计算减少的分数并得出1/4。
我最初的计划是使用strtok()函数来获取分子和分母,但我遇到了将分子和分母存储到单独变量中的问题。 这是一种有效的方法吗? 如果是这样,如何在对字符串进行标记后将分子和分母存储到2个单独的变量中?
void blah(void) { char str[30]; scanf("%s",&str); char * pch; pch = strtok (str,"/"); int i; while (pch != NULL) { i = atoi(pch); printf("\n%d", i); pch = strtok (NULL, "/"); } }
这使用sscanf来获取数字,当然可以直接使用scanf:
#include int main() { const char *s = " 13/6 \n"; int a,b; sscanf(s, "%d/%d", &a, &b); printf("%d frac %d\n", a, b); return 0; }
保持指向字符串头部的指针。
然后看看使用strchr()
来获得指向/
字符的第二个指针。
然后你可以:
- 从解除引用的第一个指针读取字符,直到第一个指针等于第二个指针。 将这些字符存储到
char []
或char *
– 这是您的分子作为C字符串。 - 从第二个指针指向的下一个字符开始读取,直到字符串末尾的
/0
nul终止符。 将这些字符存储在第二个char []
或char *
– 这是你的分母作为C字符串。
使用atoi()
将两个C字符串转换为整数。
如果strchr()
返回NULL,那么您可以非常轻松地进行错误检查,因为输入字符串中没有/
。
好的。 我有不同的方式。 使用strtol
会返回指向你添加1的’/’的指针,并在下半场再次调用strtol
。
这是第一个答案的两倍,与第二个答案一样繁琐。 🙂
#include #include int main(){ char *f = " 12/7 "; char *s; long n,d; n = strtol(f, &s, 10); d = strtol(s+1, NULL, 10); printf(" %ld/%ld \n", n, d); return 0; }
要回答你的其余问题,你肯定需要2个变量,如果它是一个分数 。 如果你可以在内部使用浮点数并且分数只是用户输入的一个很好的function,那么你可以继续划分它们并将数字存储在一个变量中。
double v; v = (double)n / d;
强制转换为两个整数的强制转换。
另一方面,如果你要使用很多分数 ,你可能想要一个结构来保存它们(如果你愿意的话,就是一个对象 )。
struct frac { long num; long den; }; struct frac f = { 12, 7 }; printf("%ld/%ld\n", f.num, f.den);
你也可以这样做……
char str[30]; scanf("%s",str); char c[30]; int i, num, denom; i = 0; while (*(str+i) != '/') { memcpy((c+i), (str+i), 1); i++; } *(c+i) = 0; i++; num = atoi(c); strcpy(c, (str+i)); denom = atoi(c); printf("%d\n", num); printf("%d\n", denom);
#include typedef struct { int num, denom; }fraction; int main() { fraction fract = {1,2}; printf("fraction: %i/%i", fract.num, fract.denom); return 0; }
这是我一般做的。
int main() { double a,b=1.0f,s; scanf("%lf/%lf",a,b); s=a/b; printf("%lf",s); }
即使用户没有输入变量b的值,该值也已初始化为1.0f,因此无论如何它都可以计算它的值。
这是在使用GCC的Ubuntu上尝试的。