【问题标题】:C: printing periods(.) with unistd writeC:使用 unistd 写入打印句点(。)
【发布时间】:2019-07-23 02:06:10
【问题描述】:

除此之外,我的程序应该将任何值小于 32 且大于 126 的字符存储为句点 (.)。然后应该打印出这段时间。

例如,如果将换行符传递给我的打印函数,它应该将其存储为句点,并在其位置打印出句点。

(我不允许使用printf,只能使用系统调用“write”)

这是我的代码的一部分,它采用称为 asci 的长度为 8 的字符数组并将其字符编码为需要打印的内容:

unsigned char asci3[8];

    for (int k = 0; k < 8; k++) {

        if ((asci[k] >= 32) || (asci[k] <= 126)) {
            asci3[k] = asci[k];                         
        }           

        else if ((asci[k] < 32) || (asci[k] > 126)) {
            asci3[k] = '.';                         
        }       

    }

这就是我打印 asci3 的方式:

if (write(1, asci3, 8) > 8) {
    return -1;                  
}   

没有打印句点。例如,对于换行符,将打印文字换行符,而不是句点。

【问题讨论】:

  • newline 是 10,10 &gt;= 32 || 10 &lt;= 126 是真的,所以它不会被句号代替。你能明白为什么10 &gt;= 32 || 10 &lt;= 126 是真的吗?
  • @immibis 不错!

标签: c hexdump unistd.h


【解决方案1】:

一个愚蠢的错误!

出现逻辑错误,而不是:

if ((asci[k] >= 32) || (asci[k] <= 126)) {
        asci3[k] = asci[k];                         
}           

else if ((asci[k] < 32) || (asci[k] > 126)) {
        asci3[k] = '.';                         
}       

应该是:

if ((asci[k] >= 32) && (asci[k] <= 126)) {
        asci3[k] = asci[k];                         
}           

else if ((asci[k] < 32) || (asci[k] > 126)) {
        asci3[k] = '.';                         
} 

第一个|| 需要替换为&amp;&amp;

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2014-05-03
    • 2016-10-02
    相关资源
    最近更新 更多