C 如何获取*字符并返回非整数?

C 如何获取*字符并返回非整数?,c,pointers,char,double,decimal,C,Pointers,Char,Double,Decimal,我试图从键盘上获取字符并返回一个double,这样我就可以输入“number.number”,作为回报,得到double number.number 到目前为止,我有以下代码,但我的程序在执行时停止工作 #包括 #包括 双倍数字(字符*ch){ 双s=1,d=0,x=0; char*ch2=0; 开关(*ch){ 大小写“+”:*ch=getchar();break; 大小写'-':*ch=getchar();s=-1;break; } 而(('0'首先,它将更易于使用,而不是为此任务编写自己的

我试图从键盘上获取字符并返回一个double,这样我就可以输入“number.number”,作为回报,得到double number.number

到目前为止,我有以下代码,但我的程序在执行时停止工作

#包括
#包括
双倍数字(字符*ch){
双s=1,d=0,x=0;
char*ch2=0;
开关(*ch){
大小写“+”:*ch=getchar();break;
大小写'-':*ch=getchar();s=-1;break;
}

而(('0'首先,它将更易于使用,而不是为此任务编写自己的函数

其次,您的函数结构没有意义。从函数
main
中的标准输入读取第一个字符并从另一个函数中读取所有后续字符是没有意义的。您应该只为特定的子任务使用子例程

但是,这两个问题并不是程序崩溃的原因。原因是读取
后的所有代码。
引用
*ch2
,而不是
*ch
。与指向有效
字符的
ch
相反,指针
ch2
指向零。它被初始化为指向内存地址0。因此,当您试图访问内存地址0时,您的程序将崩溃,因为那里没有允许您的程序访问的内容

没有理由使用第二个指针
ch2
。如果删除声明该指针的行并用
ch
替换对该指针的所有引用,则崩溃问题将得到解决

但是,修复此错误后,您的程序仍将无法工作,因为它有另一个错误。它将陷入无限循环,因为您的第二个
while
循环将不断检查读入字符是否在“0”和“9”之间,而从未读入任何新字符。因此,必须添加行“*ch=getchar()正如您在第一次
while
循环中所做的那样

修复这两个错误后,您的程序将不再崩溃或陷入无限循环。它仍然不会给出正确的结果,因为您计算小数部分的逻辑是错误的,但如何解决这个新问题,我将留给您来决定

然而,我想做的是向您展示如何更好地构造您的程序。正如我已经说过的,如何构造您的程序是没有意义的。从main内部和子例程内部调用
getchar
没有意义。最好是将所有代码简单地写入functi如果找不到有意义的方法将程序划分为多个函数,请单击main()

如果要将程序划分为一个子例程,我建议如下:

double read_number()
{
    double s = 1, d = 0, x = 0;
    char c;

    c = getchar();

    switch ( c ) {
    case '+':
        c = getchar();
        break;
    case '-':
        c = getchar();
        s = -1;
        break;
    }

    while ( ('0' <= c) && (c <= '9') ) {
        d = 10 * d + (c - '0');
        c = getchar();
    }

    if ( c == '.' ) {
        c = getchar();
        while ( ('0' <= c) && (c <= '9') ) {
            x = (c - '0') / 10;
            d = x + d;
            c = getchar();
        }
    }

    return(s*d);
}


int main( void )
{
    double d;

    d = read_number();

    printf( "%f", d );

    return 0;
}
双读编号()
{
双s=1,d=0,x=0;
字符c;
c=getchar();
开关(c){
格“+”:
c=getchar();
打破
案例'-':
c=getchar();
s=-1;
打破
}

(0')幸运(这看起来像是C,不是C++)。为什么你不能使用<代码> Sttood ?请详细说明“…程序在执行时停止工作”。。请阅读上的联机帮助。指出您为程序提供的任何特定输入、看到的结果以及预期的结果。它挂起在while循环中,您将忘记getchar