【问题标题】:Converting a c style program to a c++将 c 风格的程序转换为 c++
【发布时间】:2016-12-17 15:21:12
【问题描述】:

我有这个 C 风格的程序:

void showOneByteBinaryNumber( char c ) {
    for ( int i = 128; i >=1; i >>= 1 ) {
        // Fixed Typo - Replaced a ; with the correct {
        if ( c & i ) {
            printf( "1" );
        } else {
            printf( "0" );
        }
    }
}

int main() {
    for ( int i = 0; i < 256; i++ ) {
        printf( "%3d = ", i );
        showOneByteBinaryNumber( i );
        printf( "\n" );
     }

     return 0;
}

然后我将我的程序更改为:

void showOneByteBinaryNumber( char c ) {
    for ( int i = 128; i >= 1; i >>= 1 ) {
        if ( c & i ) {
            std::cout << 1;
        }
        else {
            std::cout << 0;
        }
    }
}

int main() {
    for ( int i = 0; i < 256; i++ ) {
        std::cout << "%3d = " << i;
        showOneByteBinaryNumber( i );
        std::cout << "\n";
    }

    return 0;
}

我应该期望看到二进制值表从 0 增加到 255,但是当我尝试使用 std::cout 将其转换为 c++ 等效版本时,我得到的其他数字不是 0 或 1在输出中。

我不确定罪魁祸首是在更改的函数内还是在 main 内的 for 循环内。我不确定如何更改 printf() "%3d" 的参数;对std::cout做同样的事情

【问题讨论】:

  • std::cout &lt;&lt; "%3d = " 并没有按照你的想法去做。
  • if ( c &amp; i ); 在 c 版本中缺少一个开头 {
  • @sjsam 我修正了错字;请提请我注意;但这不是问题;我的编辑器中的代码是正确的
  • @FrancisCugler 也许您因为输入代码而不是从编辑器复制和粘贴到 SO 编辑窗口而被否决。 ShowOneByeBinaryNumber 是什么?看,另一个错字。
  • @FrancisCugler 然后使用ideone.com 之类的东西(还有其他的)来验证您的代码。请注意,仍然将代码复制粘贴到 SO 问题中,而不是仅链接到 Web IDE 中的代码。

标签: c++ c cout


【解决方案1】:

是拉曼德普尼亚为我提供了正确答案!

在这行代码中:

printf( "%3d", i );

我试图用它替换它的地方

std::cout << "%3d = " << i; // I did initially try std::setw( 3 ) but was giving wrong results;
std::cout << std::setw(3) << " = " << i;

他对代码的评论:

std::cout << std::setw(3) << i << " = ";

这是我一直在寻找的,现在程序给了我正确的结果!

编辑

在我让它工作后,我确实将我的函数修改为:

void showOneByteBinaryNumber( char c ) {
    for ( int i = 128; i >= 1; i >>= 1 ) {
        std::cout << ( (c & i) ? 1 : 0);
     }
}

但是:David C. Rankin 也向我展示了这个版本

void showOneByteBinaryNumber( char c ) {
    for ( int i = 1 << 7; i; i >>= 1 ) {
        c & i ? std::cout << 1 : std::cout << 0;
    }
}

【讨论】:

  • 嗯,你可以用 printf("%c",(c&amp;i)?'1':'0'); 替换 if 部分,但何必呢? ;)
  • 也不要硬编码128,如果你能以编程方式找到它会很好。
  • @sjsam 好吧,这是一个粗糙的旧 c 程序,可以快速列出 [0,255] 中的二进制数字序列。我将它用作另一个站点的代码 sn-p;但我需要将它真正快速地转换为 C++; std::setw() 函数是正确的,但我在 cout 语句中使用 i" = " 的顺序让我失望了。
  • 为了简洁起见,您可以使用 三元 运算符对 showOneByteBinaryNumber( char c ) 进行修改,使其只包含 for ( int i = 1 &lt;&lt; 7; i; i &gt;&gt;= 1 ) c &amp; i ? std::cout &lt;&lt; 1 : std::cout &lt;&lt; 0;
猜你喜欢
  • 2020-08-28
  • 2011-06-13
  • 2023-01-22
  • 2020-11-25
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多