我正在尝试从popen传递转换为float作为最终结果。我已经尝试过转换为char,然后以我能找到的每种可能的方式进入浮点数,但是我每次使用printf看到的输出似乎都是错误的。我已经尝试使用tostring函数,以及在printf函数中使用%s返回正确的函数,但是一旦我尝试转换输出,它似乎都给了我错误的输出。我应该尝试不同的转换方法吗?
这是代码。
FILE * uname;
char os[80];
int lastchar;
char n;
uname = popen("sudo python ./return63.py", "r");
lastchar = fread(os, 1, 80, uname);
os[lastchar] = "\0";
n = toString(("%s", os));
printf("THE DIRECT OUTPUT FROM PY IS %s", os);
printf("THE DIRECT OUTPUT For n IS %c", n);
float ia = n - 0;
long p = ia - 0;
float dd = p - 0;
printf("Your OS is %f", dd);
PY的输出是“PY的直接输出是63.0' ,这是正确的价值, n的输出是'直接输出对于n IS�'
dd的输出是'您的操作系统是您的操作系统是236.000000'
函数tostring来自一个已回答的问题,关于如何从另一个已回答的问题中获取输出。我已尝试使用和不使用此代码。
int toString(char a[]) {
int c, sign, offset, n;
if (a[0] == '-') { // Handle negative integers
sign = -1;
}
if (sign == -1) { // Set starting position to convert
offset = 1;
}
else {
offset = 0;
}
n = 0;
for (c = offset; a[c] != '\0'; c++) {
n = n * 10 + a[c] - '0';
}
if (sign == -1) {
n = -n;
}
return n;
}
答案 0 :(得分:1)
toString
会返回int
,因此请存储int
并输出int
。
int n = toString(os); // Also removed the obfuscating '("%s", ..)'
printf("THE DIRECT OUTPUT For n IS %d", n);
此外,您的toString
函数还有未定义的行为,因为sign
可能会在未初始化的情况下被读取。
if (a[0] == '-') { // Handle negative integers
sign = -1;
offset = 1;
}
else {
sign = 1;
offset = 0;
}
你有一个潜在的os缓冲区溢出,你没有正确地对os进行空终止:
lastchar = fread(os, 1, sizeof(os) - 1, uname); // Only read one byte less
os[lastchar] = '\0'; // changed from string "\0" to char '\0'
最后你没有检查数字的输入字符串,你接受每个输入(也是“63.0”中的'。')。您可能想要停在第一个非数字字符处:
for (c = offset; !isdigit((unsigned char)a[c]); c++) {