我在使用sprintf()时遇到了一些困难 #包括 #包括 #包括 #包括 #定义二进制_精度32 int CONVERTEZTODUALSTRING(常量int编号,字符stringDualNumber[]){ int num=数字; 如果(number

我在使用sprintf()时遇到了一些困难 #包括 #包括 #包括 #包括 #定义二进制_精度32 int CONVERTEZTODUALSTRING(常量int编号,字符stringDualNumber[]){ int num=数字; 如果(number,c,C,我认为,在您对sprintf的调用中,它立即将num%2写入stringDualNumber(通过%d),然后在同一调用中再次写入该结果,因为它将现在修改的stringDualNumber引用到%s 下面是代码的修改版本,其中包含一个临时字符串以修复此问题: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #define BINARY_

我认为,在您对sprintf的调用中,它立即将num%2写入stringDualNumber(通过%d),然后在同一调用中再次写入该结果,因为它将现在修改的stringDualNumber引用到%s

下面是代码的修改版本,其中包含一个临时字符串以修复此问题:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>


#define BINARY_ACCURACY 32

int convertDezToDualString(const int number, char stringDualNumber[]){
    int num = number;
    if (number<0){
        //nothing here yet
    } else {
        for (int i = 0; i<BINARY_ACCURACY; i++){
            sprintf(stringDualNumber,"%d%s",num%2,stringDualNumber); 
                   //I think that's the part where the thing happens
            printf("%s",stringDualNumber);    //For Testing purposes
            printf("\n");
            num/=2;
        }

    }
}

int main() {
    char* stringDualNumber= (char*) calloc(BINARY_ACCURACY,sizeof(char));
    const int dezNumber = getInt();    //Gets a decimal number and returns if it's valid
    convertDezToDualString(dezNumber, stringDualNumber);
}

Input:
1234
Output:
00
110
0010
00010
110010
0010010
11010010
111010010
0011010010
00011010010
110011010010
0010011010010
00010011010010
000010011010010
0000010011010010
00000010011010010
000000010011010010
0000000010011010010
00000000010011010010
000000000010011010010
0000000000010011010010
00000000000010011010010
000000000000010011010010
0000000000000010011010010
00000000000000010011010010
000000000000000010011010010
0000000000000000010011010010
00000000000000000010011010010
000000000000000000010011010010
0000000000000000000010011010010
00000000000000000000010011010010
000000000000000000000010011010010
#包括
#包括
#包括
#包括
#定义二进制_精度32
int CONVERTEZTODUALSTRING(常量int编号,字符stringDualNumber[]){
char-tempstr[32];
int num=数字;

如果(number首先,您应该在开始时终止
stringDualNumber
,因为您使用新分配的内存区域将其传递给
sprintf()
。显然,您的内存是用零初始化的(因此我猜您正在运行调试构建)

第二:想想
sprintf()
的作用:首先,它将
num%2
的值写入字符串。然后,它将写入字符串本身的内容。但此时,字符串已包含新数字。这就是为什么您会看到它两次

编辑:
第一个循环写入
'0'
+(现在是字符串)
“0”
=
“00”

第二个循环
“1”
(将
“00”
更改为
“10”
)+(现在是字符串)
“10”
=
“110”

等等

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>


#define BINARY_ACCURACY 32

int convertDezToDualString(const int number, char stringDualNumber[]){
    char tempstr[32];
    int num = number;
    if (number<0){
        //nothing here yet
    } else {
        for (int i = 0; i<BINARY_ACCURACY; i++){
            strcpy(tempstr, stringDualNumber);
            sprintf(stringDualNumber,"%d%s",num%2,tempstr);
                   //I think that's the part where the thing happens
            printf("%s",stringDualNumber);    //For Testing purposes
            printf("\n");
            num/=2;
        }

    }
}

int main() {
    char* stringDualNumber= (char*) calloc(BINARY_ACCURACY,sizeof(char));
    const int dezNumber = 5;    //Gets a decimal number and returns if it's valid
    convertDezToDualString(dezNumber, stringDualNumber);
}

我认为一个更好…我知道我分配的太少了。解决这个问题更像是一次不顾一切的尝试。不管它会给出相同的输出。

您需要分配足够的空间来容纳空终止字符

我不会将sprintf monster函数用于此项工作。它可以通过更有效的方式实现:

int convertDezToDualString(const int number, char stringDualNumber[]){
    int num = number;
    for (int i = BINARY_ACCURACY-1; i>=0; i--){
        stringDualNumber[i]=48+(num%2);
        num/=2;
    }
}
char*convertToBinString(无符号val、char*buff、int-printing前导零)
{
无符号掩码=1>=1)
{
如果(!printLeadingZeroes)
{
如果(val和mask)打印引线零=1;
}
如果(打印引线零)
{
*wrkbuff++=val&掩码?'1':'0';
}
}
}
返回buff;
}
内部主(空)
{
char*buff=NULL;
int x=1234;
printf(“%8d二进制文件为:%s\n”,x,(buff=convertToBinString(x,buff,0));
printf(“%8d二进制文件为:%s\n”,x,(buff=convertToBinString(x,buff,1));
x=-1234;
printf(“%8d二进制文件为:%s\n”,x,(buff=convertToBinString(x,buff,0));
printf(“%8d二进制文件为:%s\n”,x,(buff=convertToBinString(x,buff,1));
免费(buff);
}```
https://godbolt.org/z/dc1KxWaqr

调用OC
stringDualNumber
后,其所有32个字节都为零。当覆盖最后一个零时,您不再有字符串。尝试调用33个字节可能相关:@pmg如果我将分配的空间更改为33,则程序具有相同的输出
stringDualNumber
数组可以包含长度为31(而不是32)的字符串。您需要为NUL字符串终止符再分配一个字节。这只是问题的一半:另一半是calloc分配的空间太少。谢谢。这很有帮助,但我认为我找到了一种更有效、更紧凑的方法。但是,不是每个数字都是双位的吗?我不明白为什么它只是最后一个…我在我的帖子中澄清了什么是g继续。不起作用。不可移植,使用了幻数。它不使用幻数()这是一种将数字转换为字符的方法,您只是插入了-1234,这是一个负数,它无论如何都不能进入方法的这一部分。当负奇数整数减半时,它们将向下舍入。这就是为什么您的-0.5得到-1,这导致字符值47,即“/”我宁愿建议你从自己的错误中吸取教训,而不是捍卫那些无法捍卫的东西。这是一种非常“幼稚”的行为转换字符和更好的方式不要使用此网站进行学习。您的评论的第二部分在您的上下文中没有意义answer@MrMxffin不是我的DV,但是
48
应该是
'0'
。您没有解决他没有为生成的字符串分配足够空间的问题。有注释DVTER吗?有问题吗有了这个答案?@Jabberwocky,它不是只有NUL字符的空字符。根据C标准:
一个所有位都设置为0的字节,称为空字符,应该存在于基本执行字符集中;它用于终止字符串。
关于
null
你说得对,但它通常也被称为NUL。UV是我的BTW。
char *convertToBinString(unsigned val, char *buff, int printLeadingZeroes)
{
    unsigned mask = 1 << (sizeof(val) * CHAR_BIT - 1);
    char *wrkbuff = buff ? buff : calloc(sizeof(val) * CHAR_BIT + 1, 1);
    
    buff = wrkbuff;
    if(wrkbuff)
    {
        for(; mask; mask >>= 1)
        {
            if(!printLeadingZeroes) 
            {
                if(val & mask) printLeadingZeroes = 1; 
            }
            if(printLeadingZeroes)
            {
                *wrkbuff++ = val & mask ? '1' : '0';
            }
        }
    }
    return buff;
}

int main(void)
{
    char *buff = NULL;
    int x = 1234;
    printf("%8d in binary is: %s\n", x, (buff = convertToBinString(x, buff, 0)));
    printf("%8d in binary is: %s\n", x, (buff = convertToBinString(x, buff, 1)));
    x = -1234;
    printf("%8d in binary is: %s\n", x, (buff = convertToBinString(x, buff, 0)));
    printf("%8d in binary is: %s\n", x, (buff = convertToBinString(x, buff, 1)));
    free(buff);
}```

https://godbolt.org/z/dc1KxWaqr