【问题标题】:Convert returned char to int将返回的 char 转换为 int
【发布时间】:2013-11-20 21:17:01
【问题描述】:

我是第一次尝试使用 C。我有一个调用 bash 脚本的程序。这个脚本printf是一个号码,通过

COUNT=$(ls | grep tool | wc -l)
printf "%s" "$COUNT"

我想获取这个数字并对其进行简单的数学运算。但是,我似乎无法将此值转换为 int,以便将其除以 2。

我尝试过类似https://stackoverflow.com/a/868508/183254

int myint = otherint - '0';

当我编译它并尝试进行数学运算时会产生分段错误。

我也尝试了很多次

int cc;
cc = count - '0';
// warning: assignment makes integer from pointer without a cast [enabled by default]
// or
// warning: initialization from incompatible pointer type [enabled by default]

无济于事。

我已经阅读了几篇关于谷歌搜索这些错误的帖子,但似乎仍然无法理解正在发生的事情,我想可能是因为我没有上下文提问者试图达到的目标。

这是我整理的一个小演示,试图了解发生了什么。结果只是让我更加困惑。

int main(){
  char *x;
  x="44";
  int xx;
  xx = (int) x - '0';
  printf("x is : %s\n", x);
  printf("xx is : %d\n",xx);// x is : 23703288
  char command[64];

  char path[9];// won't work if set to <=8
  int status;
  FILE *fp;

  //this shell script just counts the number of files in a directory
  //that match a certain string. 
  strcpy(command, "/test/test.sh");// returns 0-9; in this case it's returning 4 (supposed to anyway)


  fp = popen(command, "r");
  if (fp == NULL)
    /* Handle error */;

  while (fgets(path, 9, fp) != NULL) //again, won't work if arg2 is <=8
    //printf("%s", path);

  status = pclose(fp);

  int cc;
  cc = (int) path - '0';

  printf("result of path is %s\n",path );    // result of path is        4
  printf("result of conversion is %d\n", cc);// result of conversion is 1582717056
}

output:

x is : 44
xx is : 182607602
result of path is        4
result of conversion is 1423813191

我已经找到并阅读了一些入门书,但我不知道它们是旧的还是什么,但除了稍微解释一下指针之外并没有太大帮助。

真正让我难以置信的是上面的 sn-p 中发生了什么:

x is : 44

好的,这很有意义,因为我输入了x="44";

xx is : 182607602

笏。这看起来一定是指向某个地址的指针。根据我阅读的引物,这应该来自&amp;x;;为什么它来自应该将char 44 转换为int 44 的东西?

result of path is        4

好的(除了所有这些空格)。它几乎看起来像是被填充或什么的。 char path[9];while (fgets(path, 9, fp) != NULL) 增加了我的怀疑,但正如评论那样不起作用

result of conversion is 1423813191

相同;似乎指向地址空间。不明白为什么。

对于来自其他语言的许多人(包括我)来说,这似乎是一个困惑点——这是我的借口,我会坚持下去。

任何指针都将不胜感激(好的入门,这段代码发生了什么,真的)。

谢谢。


在 youtube 上找到了一个优秀的 9 部分系列,它很好地解释了一些 C 基础知识: https://www.youtube.com/playlist?list=PLkB3phqR3X40reMCBYSoNUPbDvM4kybMs。第 7 部分特别有用——它涵盖了指针,这是我困惑的一个重要部分。

【问题讨论】:

  • x 是 char *,而不是 char。您的 - '0' 技巧仅适用于字符。
  • 在尝试执行类似任务之前,您应该阅读初学者 C 教程和/或书籍。您要查找的函数称为strtol()然而,您必须对 C 类型系统有最低限度的了解,才能理解其用途(以及其他用途)。
  • @H2CO3 这就是为什么我在最后询问了指向良好当前引物(或其他任何东西)的指针。不过,谢谢。
  • @Random832 指向从 'char [3]' 分配给 'char' 的整数转换的不兼容指针
  • @stormdrain 我没有告诉你让它变成一个字符。我只是告诉你,为 char 设计的解决方案不适用于字符串。

标签: c


【解决方案1】:
 char *x;
  x="44";
  int xx;
  xx = (int) x - '0';

在这里,您通过将 指针 转换为 int 来减去 '0'。如果x 的类型为char,则此逻辑将起作用。

您真正想要的是将字符串转换为使用 strtol() 或相关函数。

同样,您也可以将path 转换为整数,稍后在您的代码中执行此操作。

【讨论】:

  • x 不是 char 类型的吗?或者在这种情况下是指针类型的x?我认为这是我困惑的很大一部分。用char *x 实例化一个变量意味着什么?它会指向什么?它指向什么?调用时会返回地址吗?
  • 没有。 xchar* 类型,即指向 char 的指针。当您将 "xx" 分配给 x 时(如在 char *x 中;-- 周围的 x 太多;-)您正在分配字符串文字的地址(与 @ 中第一个 x 的地址相同987654337@).
  • 所以,您提到我稍后在代码中将path 转换为int(我假设为cc)。那么为什么cc 会打印看起来像地址指针(1423813191)的东西?
  • 非常感谢您的帮助(以及对所有x 的耐心):) 应该有链接吗?我没有在“您可以在此处阅读更多内容”或您在此处引用其他答案?
  • 是的,我说的是抄送。 x 发生的确切问题也发生在路径上。虽然 path 是不同的类型(char[] 即字符数组),但当您在诸如 path - '0' 这样的表达式中使用它时,它会转换为 char*。 path[] 在其他少数情况下也会变成 char * 。但这在这里并不重要。你可以在这里阅读更多:stackoverflow.com/questions/1461432/what-is-array-decaying
【解决方案2】:

您在哪里使用此行将两位数转换为整数:

xx = (int) x - '0';

试试改成

xx = atoi(x);

这是一个很好的参考:http://www.cplusplus.com/reference/cstdlib/atoi/

走另一条路,你可能喜欢 sprintf

sprintf (buffer, "%d plus %d is %d", a, b, a+b);

您可以在此处找到更多信息:http://www.cplusplus.com/reference/cstdio/sprintf/

【讨论】:

  • atoi() 的问题是它不会在转换失败时报告任何错误。
  • 是的,您必须清理自己的数据。用 isdigit 循环应该可以解决问题。这是一个方便的链接:stackoverflow.com/questions/3850558/…
【解决方案3】:

你的线路

xx = (int) x - '0';

和提到的帖子中的一行:

int i = c[0] - '0';

不一样。您从指针中减去,但在帖子中从 char 中减去“0”。在您的情况下,正确的版本是(没有任何检查):

xx = x[0] - '0';

或如上面的帖子 - 您必须使用任何标准函数将 (char*) 转换为 int

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2015-11-23
    • 2015-12-18
    相关资源
    最近更新 更多