64,685
社区成员
发帖
与我相关
我的任务
分享
char ch[8];
sprintf(ch, "%.8d", 12345678);
for (int i = 0;i<8;i++)
printf("ch[%d]==%d\n",i,ch[i]);
[/quote]
sprintf输出8个数字时,还要在最后添加一个'\0'[/quote]
原来如此,这函数也保持着整体风格,内存不保护。多谢大神。
char ch[8];
sprintf(ch, "%.8d", 12345678);
for (int i = 0;i<8;i++)
printf("ch[%d]==%d\n",i,ch[i]);
[/quote]
sprintf输出8个数字时,还要在最后添加一个'\0' char ch[8];
sprintf(ch, "%.8d", 12345678);
for (int i = 0;i<8;i++)
printf("ch[%d]==%d\n",i,ch[i]);
// 数组总共8位
const int CountDigits = 8;
void convert(int val, char* digits) {
char digitsWithNull[9];
sprintf(digitsWithNull, "%08d", val);
memcpy(digits, digitsWithNull, CountDigits);
}
[/quote]
我在C++程序中很少用数组(除了要跟别的api配合), 直接使用std::vector/std::string/std:array
// 数组总共8位
const int CountDigits = 8;
void convert(int val, char* digits) {
char digitsWithNull[9];
sprintf(digitsWithNull, "%08d", val);
memcpy(digits, digitsWithNull, CountDigits);
}
#include <iostream>
#include <iomanip>
#include <sstream>
using namespace std;
int main() {
std::ostringstream oss;
oss << std::setw(8) << std::setfill('0');
oss << 123;
std::cout << oss.str() << std::endl; //00000123
return 0;
}
#include <cstdio>
#include <cstring>
// 数组总共8位
const int CountDigits = 8;
void convert(int val, char* digits) {
// 首先全部初始化为字符'0',方便后面的处理,例如:如果数字是val是1,那digits的前7位就不用设置了
memset(digits, '0', CountDigits);
// 由于转换结果是左补'0',所以应该从数的右边开始进行转换。相应的,存储的时候,也应该从数组的最右边开始存储
// 数组最右边的字符地址,应该是起始地址 + (字符总数 - 1),因为数字的索引是以0为基数的
digits = digits+CountDigits-1;
// 当数字最后被除为0时,就可以停止处理了,因为函数最开始时,已经将所有字符默认设置为'0'
while(val!=0) {
// 字符'0' 加上 数字0~9,对应的就是字符'0' ~ '9'
// 而对于一个较大的数,执行模10操作(C++对应 % 操作符),得到的就是该数的个位数
*digits += (val % 10);
// 字符存放位置左移一位,以便存更高位数的数值字符
digits--;
// 待转换的数除10, 这样下次进行模10操作时,得到的就是高位数的结果了
val /= 10;
}
}
int main() {
// 这里定义了9个字符,而不是8个。并将最后一个自动设置为终结符'\0'
// convert函数只会影响前8个字符,这样处理,最后就可以了通过printf来输出了
char digits[9] = {0};
convert(12345678, digits);
printf("Converted:%s\n", digits);
return 0;
}