【问题标题】:Why isn't my char array printing out in C?为什么我的 char 数组没有在 C 中打印出来?
【发布时间】:2020-12-14 21:30:23
【问题描述】:

我有这个程序试图在不使用 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() {

【问题讨论】:

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

标签: c pointers char


【解决方案1】:

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

ans[numDigits] = remainder + '0';

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2023-01-13
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多