读取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()来获得指向/字符的第二个指针。

然后你可以:

  1. 从解除引用的第一个指针读取字符,直到第一个指针等于第二个指针。 将这些字符存储到char []char * – 这是您的分子作为C字符串。
  2. 从第二个指针指向的下一个字符开始读取,直到字符串末尾的/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上尝试的。