在c中取消引用指针时遇到问题

在c中取消引用指针时遇到问题,c,pointers,C,Pointers,我是一个比较擅长运动的人,我发现自己在很多体育书籍上都可以找到,用手工计算货币线赔率中的小数赔率。我正试图编写一个程序,至少可以消除一遍又一遍地计算的负担 我的程序将接受输入“一队资金线团队一队二队资金线团队二”,并输出团队名称以及背面和下注的十进制赔率,如下所示: 输入:Rams+230 Bucs-280 我尝试过去引用的所有排列,但似乎无法阻止它产生分段错误 #include <stdio.h> #include <stdlib.h> void calcML(int

我是一个比较擅长运动的人,我发现自己在很多体育书籍上都可以找到,用手工计算货币线赔率中的小数赔率。我正试图编写一个程序,至少可以消除一遍又一遍地计算的负担

我的程序将接受输入“一队资金线团队一队二队资金线团队二”,并输出团队名称以及背面和下注的十进制赔率,如下所示:

输入:Rams+230 Bucs-280

我尝试过去引用的所有排列,但似乎无法阻止它产生分段错误

#include <stdio.h>
#include <stdlib.h>

void calcML(int a, float *b, float *c);

int main (int argc, char* argv[])
{
        int oneML, twoML;
        float oneDF, oneDA, twoDF, twoDA;

        oneML = atoi(argv[2]);
        twoML = atoi(argv[4]);

        printf("Team one is %s with a ML of %i.\nTeam two is %s with a moneyline of %i.\n", argv[1], oneML, argv[3], twoML);

        calcML(oneML, &oneDF, &oneDA);
        calcML(twoML, &twoDF, &twoDA);

        printf("%s %f %f\n", argv[1], oneDF, twoDA);
        printf("%s %f %f\n", argv[3], twoDF, oneDA);
}

void calcML (int a, float *b, float *c)
{
        if (a < 0){
          int tmp = -a;
          *b = 1 + tmp/100;
          *c = 100/tmp;
        }
        else {
          *b = 1 + a/100;
          *c = 100/a;
        }
}
现在的输出是:

Team one is Rams with a ML of +230.
Team two is Bucs with a ML of -280.
Segmentation fault

正如我所说,我知道这是一个指针算术问题,但我尝试了一百万种不同的排列方式,却无法解决。感谢所有不介意指出我愚蠢错误的人

我无法重现segfault,但正如其他人所提到的,您似乎无意中截断了任何浮点值。在
calcML
中,当您执行
1+tmp/100时编译器通过将
tmp
强制为整数来“帮助您”。这是在MacBook上使用的
Clang10.0.1
。我可以想象,将
1
更改为
1.0
100
更改为
100.0
将有助于澄清一些数学问题。据我所知,您的指针至少看起来都是正确的。

这是修复浮点和一些算术后完成的代码

#include <stdio.h>
#include <stdlib.h>

void calcML(int a, float *b, float *c);

int main (int argc, char* argv[])
{
        int oneML, twoML;
        float oneDF, oneDA, twoDF, twoDA;

        oneML = atoi(argv[2]);
        twoML = atoi(argv[4]);

        printf("Team one is %s with a moneyline of %i.\nTeam two is %s with a moneyline of %i.\n", argv[1], oneML, argv[3], twoML);

        calcML(oneML, &oneDF, &twoDA);
        calcML(twoML, &twoDF, &oneDA);

        printf("%s %f %f\n", argv[1], oneDF, oneDA);
        printf("%s %f %f\n", argv[3], twoDF, twoDA);
}

void calcML (int a, float *b, float *c)
{
        if (a < 100){
          float tmp = -a;
          *b = 1.0 + 100.0/tmp;
          *c = tmp/100.0 + 1;
        }
        else {
          *b = 1.0 + a/100.0;
          *c = 100.0/a + 1;
        }
}
#包括
#包括
无效计算cml(整数a、浮点*b、浮点*c);
int main(int argc,char*argv[])
{
int-oneML,twoML;
浮动oneDF,oneDA,twoDF,twoDA;
oneML=atoi(argv[2]);
twoML=atoi(argv[4]);
printf(“第一组是%s,资金额度为%i.\n第二组是%s,资金额度为%i.\n”,argv[1],oneML,argv[3],twoML);
calcML(oneML、oneDF和twoDA);
calcML(twoML、twoDF和oneDA);
printf(“%s%f%f\n”,argv[1],oneDF,oneDA);
printf(“%s%f%f\n”,argv[3],twoDF,twoDA);
}
无效计算cml(整数a、浮点*b、浮点*c)
{
如果(a<100){
浮动tmp=-a;
*b=1.0+100.0/tmp;
*c=tmp/100.0+1;
}
否则{
*b=1.0+a/100.0;
*c=100.0/a+1;
}
}

无法复制。我建议您下一步应该将
main()
中的第一行添加为
if(argc<5){/*handle error*/}
与SEGFAULT不相关,但是当您分配给
b
c
时,您将丢弃小数部分。我运行了您的代码,没有得到seg错误。我得到了这个输出:
Team one是一个ML为230的Rams。第二队是比克斯队,比分是-280。Rams 3.0000000.000000 Bucs 3.0000000.000000
无seg故障。也许您更改了代码,然后在再次运行之前忘记了编译?最大的线索是您的输出在输出的第二行显示
ML
,而问题中给出的代码则输出
moneyline
。旁白:
tmp/100
执行整数除法。谢谢!是的,我想我发布这个版本时并不知道我已经修复了它哈哈。我认为这是错误的,因为它给了我随机数,但实际上只是因为浮点数错误。谢谢
#include <stdio.h>
#include <stdlib.h>

void calcML(int a, float *b, float *c);

int main (int argc, char* argv[])
{
        int oneML, twoML;
        float oneDF, oneDA, twoDF, twoDA;

        oneML = atoi(argv[2]);
        twoML = atoi(argv[4]);

        printf("Team one is %s with a moneyline of %i.\nTeam two is %s with a moneyline of %i.\n", argv[1], oneML, argv[3], twoML);

        calcML(oneML, &oneDF, &twoDA);
        calcML(twoML, &twoDF, &oneDA);

        printf("%s %f %f\n", argv[1], oneDF, oneDA);
        printf("%s %f %f\n", argv[3], twoDF, twoDA);
}

void calcML (int a, float *b, float *c)
{
        if (a < 100){
          float tmp = -a;
          *b = 1.0 + 100.0/tmp;
          *c = tmp/100.0 + 1;
        }
        else {
          *b = 1.0 + a/100.0;
          *c = 100.0/a + 1;
        }
}