c - 为什么我的 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() {
解决方案
它不会打印任何内容,因为您将余数的数值分配给 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
. 您还可以初始化ans
为0
(这是 的数字表示\0
),因此您可以忘记手动设置终止符。
推荐阅读
- vba - 使用 Excel VBA 跳过值为空白的处理
- java - Spring Boot 索引未加载
- javascript - 将 Jinja2 数据发送到另一个 js 文件——flask
- c++ - QPointer::clear() 是否删除其引用的指针,或者是否“清除此 QPointer 对象”。还有别的意思吗?
- html - Highlight a div element in a content editable input as if it was text
- typescript - 如何在没有复杂构建系统的情况下使用 Vue 和 Typescript?
- contentful - Contentful Management API 上传图片
- javascript - 使用 parseInt 函数需要指南
- raspberry-pi3 - 当我在 RaspBerry pi 中安装 Bazel 时出错
- android - 如何更改 listView 的一项的颜色背景