-1

在介绍代码之前,先介绍一下背景知识:我有一个名为 的字符指针数组math,现在,在while循环中,我试图将数学中的值转换为intusingatoi并将其保存在intvariableai中。没有编译错误。但是,当我尝试打印时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++;
}
4

3 回答 3

1

记住write不是printf。所以

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

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

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

printf("%d", ai);

反而。

于 2012-06-12T17:34:30.747 回答
0
write(STDOUT_FILENO,&ai,sizeof(&ai));

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

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

如果你想把你的号码写成一个可读的字符串来stdout使用类似的东西

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

math已经有了你想在上面看到的字符表示stdout

如果你真的想抽出ai使用的比特表示

write(STDOUT_FILENO, &ai, sizeof ai);
于 2012-06-12T19:21:07.350 回答
0

考虑您的附加信息

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

你可能有一些额外的魔法STDOUT_FILENO。考虑使用fdopen,代替 (绝对不正确)fprintf和(可能不正确) 。fflushwriteprintf

像这样:

FILE* f = fdopen(STDOUT_FILENO, "w");
fprintf(f, "%d", ai);
fflush(f);
...
fclose(f); // also closes the socket
于 2012-06-12T18:28:15.973 回答