gpt4 book ai didi

c - atof 产生奇怪的结果

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

我试图使用 atof() 将字符串转换为 double (显然),但结果不是我所期望的。以下是 atof() 之前有关变量值的代码和调试信息:

d = atof (arg);
next.db = d;

*debug info*
arg = 0x0034f7b0 "10.0"
d = 0.0000000000000000

程序单步执行 atof() 后。结果如下:

arg = 0x0034f7b0 "ôþSÄ÷4"
d = 0.0000000000000000

正如您所看到的,在命令之前,arg 变量确实保存了一个有效的 double 值。但是,返回值是 0。令我困惑的是,为什么 arg 的值会改变?

另外,我确实包含了 stdlib.h。同样,arg 声明为:

char *arg;

如果有帮助的话,“10.0”是从文件中读取的。

更多代码:

void read_instructions()
{
char *str;
char *arg;
int n;
char c;
double d = 0;
instruction next = {0};

while (!feof(datafile)) {
// Fetch the next string
// if (push or pop), get the next argument
// create instructiwn and add to instruction array
str = get_next_string();

if (strncmp (str, "P", 1) == 0) {
if (strncmp (str, "PUSH", 4) == 0) {
next.func = pushFunc;
}
else {
next.func = popFunc;
}
arg = get_next_string();
n = arg[0];
if (n > 64 && n < 71)
next.ch = arg[0];
else {
d = atof (arg);
next.db = d;
}
instr[instr_count] = next;
instr_count++;
}
else {
c = str[0];


switch (c) {
case 'A' :
next.func = addFunc;
break;
case 'S' :
next.func = subFunc;
break;
case 'M' :
next.func = multFunc;
break;
case 'D' :
next.func = divFunc;
break;
case 'H' :
next.func = haltFunc;
default :
printf ("Invalid instruction");
}
instr[instr_count] = next;
instr_count++;
}
}
fclose (datafile);
}

这是打开和访问文件的给定代码:

FILE *datafile;


int main(int argc, char *argv[])
{
if (argc != 2) {
printf("error, incorrect number of arguments");
haltFunc(instr[0]);
}

open_file(argv[1]);
read_instructions();
execute_instructions();
return 0;
}

void open_file(char* argv)
{
char buf[1024];
char cwd[512];

getcwd(cwd, sizeof cwd);
sprintf(buf, "%s\\%s", cwd, argv);

if (!(datafile = fopen(buf, "r"))) {
printf("Error: Make sure your file is located here:\n%s", buf);
}
}

char* get_next_string()
{
char str[15];

fscanf(datafile, "%s", &str);

return str;
}

头文件:

#ifndef MAIN_HEADER_H
#define MAIN_HEADER_H

#define INSTR_SIZE 30

typedef struct {
void (*func)(instruction);
union {
double db;
char ch;
};
} instruction;

int main(int, char*);
char* get_next_string();
void open_file(char*);
void read_instructions();
void execute_instructions();
void pushFunc(instruction instr);
void popFunc(instruction instr);
void addFunc(instruction instr);
void subFunc(instruction instr);
void multFunc(instruction instr);
void divFunc(instruction instr);
void haltFunc(instruction instr);

#endif

这是测试文件:

PUSH 10.0
PUSH 4.0
PUSH 7.0
PUSH 5.0
POP D
POP E
POP
PUSH D
ADD
PUSH 5.0
POP B
PUSH 17.0
POP E
PUSH B
PUSH E
SUB
HALT

最佳答案

您的问题可能是由 get_next_string() 函数返回指向临时本地字符数组的指针引起的。一旦函数返回,str[] 曾经使用的堆栈内存就会被其他自动变量覆盖。这可以解释为什么 arg 被损坏。

有几种可能的修复方法。

  • 调用者可以分配内存来保存字符串,并将此指针传递给函数以填充数据。
  • 被调用者可以为字符串分配内存并返回该指针。这还将所有权返回给调用者,并在完成后调用 free() 的责任。
  • str[] 数组可以在函数内声明为static。它不再是临时的,但请注意,每次调用该函数时,之前的字符串都会被覆盖。

关于c - atof 产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11424836/

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