2016-12-30 39 views
-2

我想从popen pass转换为浮点数作为最终结果。我试图转换为字符,然后以各种可能的方式转换为浮点数,但是我看到使用printf的输出每次似乎都是错误的。我曾尝试使用tostring函数,以及在printf函数中使用返回正确函数的%s,但是,当我尝试转换输出时,它似乎都会给我错误的输出。我应该尝试一种不同的转换方法吗?为什么C中的转换方法继续失败?

这是代码。从PY

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); 

输出是 '直接输出FROM PY IS 63.0',这是正确的值,从第n 输出 '直接输出对于N是'

从输出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

'lastchar'未初始化 - 它看起来像你用'stchar'你应该使用'lastchar'吗? (另外,为了将来的参考,你应该为可能失败的呼叫添加错误检查,例如'popen'。) –

+0

你是完全正确的,我忘了我在那里,我一直在寻找其他转换方式,而我没有在正确的地方。将编辑帖子。谢谢! – Johnnyman

+0

请按照[此处](http://stackoverflow.com/help/mcve)的说明提供更好的示例。在你展示的代码中没有'stchar'这样的变量。 'toString'的功能目的对我来说还不清楚。 – pbn

回答

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; 
} 

你有一个潜在的操作系统的缓冲区溢出,你是不是做正确的操作系统的空终止:

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++) { 
+0

输入代码后,这是我的控制台输出。直接输出为n IS -2762您的操作系统是-2762.000000您的操作系统是-2762.000000 – Johnnyman

+0

@Johnnyman请使用更新的代码再试一次。在调用'isdigit'之前,还请注意额外的演员阵容。 –

+0

这样做!谢谢!我竖起大拇指,但由于没有代表而没有改变。再次感谢! – Johnnyman