gpt4 book ai didi

c - 如何获取 *chars 并返回非整数?

转载 作者:行者123 更新时间:2023-11-30 14:32:39 25 4
gpt4 key购买 nike

我正在尝试从键盘获取字符并返回一个 double ,以便我可以编写输入“number.number”并返回得到 double number.number

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

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

double number(char *ch) {
double s=1, d=0, x=0;
char *ch2= 0;

switch (*ch) {
case '+': *ch = getchar(); break;
case '-': *ch = getchar(); s = -1; break;
}
while ( ('0' <= *ch) && (*ch <= '9') ) {
d = 10*d + (*ch - '0');
*ch = getchar();
}
if(*ch == '.'){
*ch2 = getchar();
while ( ('0'<=*ch2) && (*ch2<='9') ) {
x = (*ch2 - '0') / 10;
d = x + d;
}
}
return (s * d);
}

int main(void) {
double d;
char ch;

ch = getchar();
d = number(&ch);
printf("%f",d);

return 0;
}

感谢任何帮助,而且我的代码中很可能存在明显的错误,因为我是一个该死的初学者。

最佳答案

首先,使用 strtod 会更简单而不是为此任务编写自己的函数。

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

但是,这两个问题并不是程序崩溃的原因。原因是读取'.'后的所有代码都引用了*ch2而不是*ch。与指向有效charch 相比,指针ch2 不指向任何内容。它被初始化为指向内存地址0。因此,当您尝试访问内存地址0时,您的程序将崩溃,因为那里没有任何内容可供您的程序访问。

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

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

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

但是,我想做的是向您展示如何更好地构建您的程序。正如我已经说过的,你如何构建你的程序是没有意义的。从 main 内部和子例程内部调用 getchar 是没有意义的。如果您找不到一种有意义的方法将程序划分为多个函数,那么最好将所有代码都写入函数 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;
}

这样,您就不再需要通过指针传递参数(这会使您的程序变得不必要的复杂)。

请注意,这段代码仍然包含我上面提到的小数部分计算不正确的错误。

作为旁注,我还想指出,作为一项规则,您不应该将 getchar 的结果存储到 char 中,而是存储到int,因为如果 getchar 返回非字符(例如 EOF),则 char 不够大,无法存储结果。请参阅documentation on getchar了解更多信息。但是,这并不是您的程序无法运行的原因。

关于c - 如何获取 *chars 并返回非整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59733039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com