0:
#include <stdio.h>
char *myitoa(int num, char *str);
char *myitoa(int num, char *str)
{
int dec = 1; // 记录位数
int i = 0; // 数组下标
int temp; // 临时变量
if (num < 0){
str[i++] = '-'; // 给字符串的第一个字符添加为负号
num = -num;
}
temp = num;
while (temp > 9){
dec *= 10;
temp /= 10;
}
while (dec != 0){
str[i++] = num / dec + '0';
num = num % dec;
dec /= 10;
}
return str;
}
int main()
{
char str[10];
printf("%s\n",myitoa(520,str));
printf("%s\n",myitoa(-1234,str));
return 0;
}
1:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
int myprintf(char *format,...);
int countInt(int num);
void printInt(int num);
void printStr(char *str);
int myprintf(char *format,...)
{
int i = 0;
int count = 0;
int darg; // 接收整数
char carg; // 接收字符
char *sarg; // 接收字符串
va_list vap; // 定义指针变量
va_start(vap,format); // 初始化vap指针
while (format[i] != '\0'){ // 首先依次打印format,也就是调用myprintf函数时,括号内逗号以前的参数都是format
if (format[i] != '%'){ // 判断是否需要进入格式化打印
putchar(format[i++]);
count++;
} else {
switch (format[i+1]) // format[i+1]就是判断%后面的字符是什么
{
case 'd':
{
darg = va_arg(vap,int); // 将int传给darg
printInt(darg);
count += countInt(darg);
break;
}
case 'c':
{
carg = va_arg(vap,int);
putchar(carg); // 打印字符直接putchar就可以
count++;
break;
}
case 's':
{
sarg = va_arg(vap,char *);
printStr(sarg);
count += strlen(sarg);
break;
}
}
i += 2; // 格式化打印的两个字符需要加上
}
}
va_end(vap); // 重置vap指针变量
return count;
}
// 统计整型数的位数
int countInt(int num)
{
int count = 0;
if (num < 0){
count++;
num = -num;
}
do {
count++;
} while (num /= 10);
return count;
}
// 打印整数
void printInt(int num)
{
int dec = 1; //步长
int temp;
if (num < 0){
putchar('-');
num = -num;
}
temp = num;
while (temp > 9){
dec *= 10;
temp /= 10;
}
while (dec != 0){
putchar(num / dec + '0');
num %= dec;
dec /= 10;
}
}
// 打印字符串,通过指针实现一个字符一个字符的打印
void printStr(char *str)
{
int i = 0;
while (str[i] != '\0'){
putchar(str[i++]);
}
}
int main()
{
int i;
i = myprintf("Hello %s\n","FishC"); // count返回后被i接收,"FishC"是vap,"hello %s\n"是format,以下同理
myprintf("共打印了%d个字符(包含\\n)\n",i);
i = myprintf("int: %d, char: %c\n",-520,'H');
// 这里有两个参数,并且不同类型,当执行到%d时,vap指向的是-520,当执行完-520后,vap会向后移动一个参数
// 这时vap就指向了'H',所以在调用时,首先
myprintf("共打印了%d个字符(包含\\n)\n",i);
return 0;
}