【问题标题】:C -- Filling char * using a loop and index --- NOT WORKINGC -- 使用循环和索引填充 char * --- 不工作
【发布时间】:2013-05-08 05:06:48
【问题描述】:

这段代码是将十进制数转换为二进制的函数的一部分,将其放置在由调用函数创建并通过引用传递的 char instBin[33] 的特定索引中。它传入十进制数,即您想要的二进制位数(在给定的 bin 编号前面附加额外的 0)。我已经摆弄了一段时间,但我无法将 0 和 1 放入数组中。我已经明白了 instBin[i] = '1';根本不工作——当我打印 instBin 时,什么也没发生。我看过其他做这种事情的例子,但似乎在选择索引时给字符数组一个变量应该可以工作......有什么想法为什么我的不是?

int printBin(int num, int numBits, int startIndex, char * instBin){
    int r, i; /* r for remainder, i for index */
const int FAIL = 0;
i = startIndex + numBits; /* start indexing at end of current segment */
while (num > 0)
{
    /* as long as i >= startIndex, we can still add to array */
    if (i >= startIndex){
        r = num % 2; /* find the remainder */
        if (r == 1)
            instBin[i] = '1';
        else /* r == 0 */
            instBin[i] = '0';
        num /= 2; /* then actually divide the number */
        i--;
    }
    else /* num is too big to fit in given number of bits */
    return FAIL;
}
/* return the 1 for success*/
return 1;
}

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读FAQ。请显示函数定义行(带有返回类型、函数名和参数声明的那一行)!定义 FAIL 很好;为什么不定义 PASS 或 SUCCESS 或其他什么?在 Unix 上,系统函数通常返回 0 表示成功——这与您使用的约定相反。
  • 提示:您可以简单地写instBin[i]='0'+num%2;。而像 /* find the remainder */ 这样的 cmets 不会在你的代码中添加任何信息。
  • 好建议,谢谢!哦,对于 Sergi0,instBin 被定义为:char instBin[33]; //一个空字节的位置
  • 我认为这段代码工作正常,只要参数没问题。你怎么称呼它?你如何打印数组的内容?如果是字符串,则需要在末尾添加'\0'
  • 我把 '\0' 放在 instBin[32] 的调用函数中。就在它到达“instBin[i] = '1';”的时候实际上,instBin 没有任何反应,如果我在它后面放一个 printf,它什么也没有显示。使用立即数 (1, 2, 3) 添加到 instBin 很好,但是当我在这种情况下使用此变量时,它什么也没做。

标签: c string loops indexing char


【解决方案1】:

有两个主要问题。第一个是栅栏错误。假设您的意图是将最重要的位放入缓冲区startIndex,您需要从i = startIndex + numBits - 1 开始。如果您需要对此有说服力,请考虑使用 numBits = 1 的示例。

第二个问题是,当数字小到需要前导零时,您的循环不会提供它们。它一次提供一位数字,直到数字达到 0,然后停止。您需要在主循环之后进行第二个循环,以添加零。如果您在主循环之后查看i 的值,它会告诉您主循环停止的位置,因此您可以像这样完成工作:

while(i >= startIndex)
    instBin[i--] = '0';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多