【问题标题】:Value returned by atoi can not be printedatoi 返回的值无法打印
【发布时间】:2012-06-12 17:29:33
【问题描述】:

在介绍代码之前,先介绍一下背景知识:我有一个名为 math 的字符指针数组,现在,在 while 循环中,我尝试使用 @ 将数学中的值转换为 int 987654324@ 并将其保存在int 变量ai 中。没有编译错误。但是,当我尝试打印 ai 时,它并没有打印出来。程序以某种方式运行而不会崩溃。我不知道问题是什么,如果有问题程序应该在atoi 上崩溃,如果没有问题,那么它应该打印ai

代码如下:

int c1 = 3; //the array contains 3 characters 1 2 3
int c2 = 0;
while(c2 < c1)
{
    int ai;
    ai = atoi(math[c2]);
    // the array is valid, I have checked it time and again so is the content in array
    write(STDOUT_FILENO,math[c2],1); //this works fine.
    write(STDOUT_FILENO,&ai,sizeof(&ai));
    //this doesn't print anything and somehow loop goes on to meet
    //the condition.
    c2++;
}

【问题讨论】:

  • 什么是“math[c2]”?它是如何定义的?
  • 它的 c2++;在倒数第二行,抱歉打错了。
  • math[c2]是一个字符指针数组,定义为:char *math[10];
  • 阅读“写程序”,它接受一个字符串,因此如果 math 是一个字符串,那么 math[c2] 将是一个字符。 atoi 的输出将是一个整数。写入不接受整数。此外,您正在尝试使用“引用”ai,而不是 ai 本身。
  • 我试过 printf("%d",&ai);这也不起作用。

标签: c linux char int atoi


【解决方案1】:

记住write 不是printf。所以

write(STDOUT_FILENO,&ai,sizeof(&ai))

sizeof(int)个字符写入STDOUT;如果我们假设一个 32 位的int,它会将 ASCII 码表中对应的字符打印为(ai &gt;&gt; 24) &amp; ff(ai &gt;&gt; 16) &amp; ff(ai &gt;&gt; 8) &amp; ff(ai &gt;&gt; 0) &amp; ff,这可能是四个不可打印的字符。

如果要将整数的字符串表示形式写入控制台,请使用:

printf("%d", ai);

改为。

【讨论】:

  • 嗯,那必须工作。也许您的 char 数组不代表有效的整数字符串。您是否尝试将atoi 的返回值与预期结果进行比较?
  • 检查似乎不起作用。我比较了:if(ai==1){//它应该在第一次迭代中 printf("%d",1);} else{ printf ("%d",0); } 但它在任何时候都不会打印 0 或 1。
  • 并且完美地在同一个循环中执行其余代码。
  • 如果 ifnoither 分支正在运行,您的代码就会遇到严重问题。正是其中之一,必须运行 if 或 else 部分。
  • “正如我的先生总是说 printf 不可靠!”现在你只是在开玩笑,对吧?
【解决方案2】:

考虑您的其他信息

它是一个使用套接字的多处理客户端服务器建模代码

你可能在STDOUT_FILENO 中有一些额外的魔力。考虑使用fdopenfprintffflush 而不是(绝对不正确的)write 和(可能不正确的)printf

像这样:

FILE* f = fdopen(STDOUT_FILENO, "w");
fprintf(f, "%d", ai);
fflush(f);
...
fclose(f); // also closes the socket

【讨论】:

    【解决方案3】:
    write(STDOUT_FILENO,&ai,sizeof(&ai));
    

    ai 的位模式写入stdout,但使用ai 地址的长度而不是ai 的长度。在现代机器上,48 通常是不同的值,因此您正在编写任意垃圾,甚至会产生访问错误。

    无论如何,这可能不是你想要的。

    如果您想将您的号码作为可读字符串写入stdout,请使用类似

    write(STDOUT_FILENO, math, strlen(math));
    

    math 已经具有您想在stdout 上看到的字符表示。

    如果您真的想将ai 的比特表示形式抽出来,请使用

    write(STDOUT_FILENO, &ai, sizeof ai);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2021-04-08
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多