为什么不是';我的字符数组不是用C打印出来的吗?

为什么不是';我的字符数组不是用C打印出来的吗?,c,pointers,char,C,Pointers,Char,我有一个程序,它试图在不使用atoi的情况下将字符串转换为不同的基。为什么输出不在最后打印?文本“Output:”打印出来,但后面什么也没有 在这之前,代码似乎一直有效。我继续添加了空字节 #include <stdio.h> #include <math.h> #include <stdlib.h> void Int(char* numstring, int base) { char *digitPtr = numstring; char

我有一个程序,它试图在不使用atoi的情况下将字符串转换为不同的基。为什么输出不在最后打印?文本“Output:”打印出来,但后面什么也没有

在这之前,代码似乎一直有效。我继续添加了空字节

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

void Int(char* numstring, int base) {

    char *digitPtr = numstring;
    char ans[100];

    int decVal = 0;
    int totalVal = 0;

    int numDigits = 0;

    // Go through the entire string to get the decimal value of the number.

    while (*digitPtr != '\0') {
        numDigits++;
        digitPtr++;
    }

    // Now calculate decimal value of the string.

    printf("before decimal value calc \n");
    //  *digitPtr = numstring;

    int length = numDigits;

    numDigits--;

    printf("numDigits: %d \n", numDigits);

    
    for (int i = 0; i < length; i++)
    {
        printf("calcuating the dec \n");
        decVal = (*numstring - 48);
        printf("dec Value: %d \n", decVal);
        printf("power: %f \n", pow(10, numDigits));     

        totalVal = totalVal + decVal *  pow(10, numDigits);

        printf("totalVal %d \n", totalVal);
        numDigits--;
        numstring++; 
    }

    //*digitPtr = numstring;
    numDigits = length;

    printf("totalVal %d \n", totalVal);

    while (totalVal > 0) {
        int remainder = totalVal % base;
        printf("remainder: %d \n", remainder);
        totalVal = totalVal / base;
        ans[numDigits] = remainder;
        numDigits--;
    }

    ans[99] = '\0'; 

    printf("Output: %s \n", ans); 
}

int main() {
#包括
#包括
#包括
void Int(char*numstring,Int base){
char*digitPtr=numstring;
char-ans[100];
int-decVal=0;
int-totalVal=0;
int numDigits=0;
//遍历整个字符串以获取数字的十进制值。
而(*digitPtr!='\0'){
numDigits++;
digitPtr++;
}
//现在计算字符串的十进制值。
printf(“十进制值计算前”);
//*digitPtr=numstring;
int length=numDigits;
numDigits--;
printf(“numDigits:%d\n”,numDigits);
for(int i=0;i0){
整数余数=totalVal%基数;
printf(“余数:%d\n”,余数);
totalVal=totalVal/基准;
ans[numDigits]=余数;
numDigits--;
}
ans[99]='\0';
printf(“输出:%s\n”,ans);
}
int main(){

它不会打印任何内容,因为您正在将余数的数值指定给一个
字符,但您没有考虑数字在ASCII表中从48开始(即,
'0'
),因此您应该将“起始点”添加到余数:

ans[numDigits] = remainder + '0';
这就是说,还有另一个问题:在
while
循环之前,您将输入值的长度分配给
numDigits
,但是数字的长度可能与新基数中数字的长度不同(例如,基数10中的32长两位数,但基数2中的32多了四位数)。一种解决方案可以是使
numDigits
从0开始,在每次迭代后递增,并按相反顺序逐字符打印字符串。或者,计算自定义基中数字位数的数学方法是将自定义基中数字的向下舍入对数加1。为此,请使用y因为C标准库只提供以2、e和10为底的日志,所以您可以使用对数的属性

numDigits = (int)(floor(log(totalVal) / log(base) + 1);
按照这种方法,您不必更改循环,并且可以将结果打印为字符串


请注意,您不应该将
ans[99]
设置为
'\0';
,因为转换后的数字和字符串结尾之间可能存在垃圾;相反,您应该将其设置为
numDigits
。您还可以将
ans
初始化为
0
(这是
\0
的数字表示),因此您可以忘记手动设置终止符。

ans[numDigits]=余数+0'
此外,使用
numDigits
,因为索引看起来不正确。例如,如果有一个数字,那么它将存储到
ans[1]
中,而不是
ans[0]
ans[99]='\0';
也是错误的,因为它将NUL放在数组的末尾而不是数字序列的末尾-结果是数字后面有垃圾,
printf
将尝试将其作为字符串的一部分进行解析。无论如何,除非您将函数作为家庭作业,否则您可以使用
strtol
我收到通知你说这不是家庭作业。(但后来你删除了评论)在这种情况下,你真的不需要重新发明轮子。是的,这不是家庭作业,但这是一个“挑战”,你不应该使用这些功能