首页 > 解决方案 > 为什么我的 char 数组没有在 C 中打印出来?

问题描述

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

该代码似乎一直有效。我继续并添加了空字节。

#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() {

标签: cpointerschar

解决方案


它不会打印任何内容,因为您将余数的数值分配给 a char,但您没有考虑到 ASCII 表中的数字从 48(即'0')开始,因此您应该添加“起点”剩下的:

ans[numDigits] = remainder + '0';

也就是说,还有另一个问题:您将输入值的长度分配给循环numDigits之前while,但数字的长度可能与新基数中的数字长度不同(例如,32 in以 10 为底的长度为两位数,但以 2 为底的长度为四位)。一个解决方案可能是numDigits从 0 开始,在每次迭代后递增它并以相反的顺序逐个字符地打印字符串。或者,一种用于获取自定义基数中数字位数的数学方法是将自定义基数中的数字的四舍五入对数加一。为此,您可以使用对数的属性,因为 C 标准库仅提供以 2、e 和 10 为底的日志。

numDigits = (int)(floor(log(totalVal) / log(base) + 1);

按照这种方法,您不必更改循环,并且可以将结果打印为字符串。

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


推荐阅读