读取C中的分数

时间:2013-03-11 06:08:58

标签: c fractions

如何读取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, "/");
  }
}

6 个答案:

答案 0 :(得分:1)

这使用sscanf来获取数字,当然可以直接使用scanf:

#include <stdio.h>
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;
}

答案 1 :(得分:1)

保持指向字符串头部的指针。

然后使用strchr()来获取指向/字符的第二个指针。

然后你可以:

  1. 从解除引用的第一个指针读取字符,直到第一个指针等于第二个指针。将这些字符存储到char []char *中 - 这是您的分子作为C字符串。
  2. 从第二个指针指向的下一个字符开始读取,直到字符串末尾的/0 nul终结符。将这些字符存储在第二个char []char *中 - 这是您的分母作为C字符串。
  3. 使用atoi()将两个C字符串转换为整数。

    如果strchr()返回NULL,那么您可以非常轻松地进行错误检查,因为输入字符串中没有/

答案 2 :(得分:1)

好的。我有不同的方式。使用strtol将返回指向您添加1的'/'的指针,并在下半场再次调用strtol

这是第一个答案的两倍,与第二个答案一样繁琐。 :)

#include <stdio.h>
#include <string.h>

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个变量,如果它将是分数。如果您可以在内部使用浮点数并且分数只是用户输入的一个很好的功能,那么您可以继续划分它们并将数字存储在一个变量中。

double v;
v = (double)n / d;

强制转换为double是为了强制对两个整数进行浮点除法。

另一方面,如果您要使用很多分数,您可能需要创建一个结构来保存它们(对象 ,如果你愿意的话。

struct frac {
    long num;
    long den;
};
struct frac f = { 12, 7 };
printf("%ld/%ld\n", f.num, f.den);

答案 3 :(得分:0)

你也可以这样做......

  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);

答案 4 :(得分:0)

#include <stdio.h>

typedef struct
{
int num, denom;
}fraction;

int main()
{
fraction fract = {1,2};

printf("fraction: %i/%i", fract.num, fract.denom);
return 0;
}

答案 5 :(得分: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上尝试的。