为什么我在C中的转换方法会继续失败?

时间:2016-12-30 08:04:54

标签: c

我正在尝试从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;
}

1 个答案:

答案 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++) {