问题描述
修改itoa函数,使得该函数可以接收三个参数。其中,第三个参数为最小字段宽度。为了保证转换后所得的结果至少具有第三个参数指定的最小宽度,在必要时应在所得结果的左边填充一定的空格。
问题分解
- 主函数main
-
核心函数 itoa(n, s, len)。这道题比较简单,在3-4中itoa的基础上只要判断当前生成的字符串长度是否等于len,否则左侧用空格填充。因此我们的算法描述可以为:
- 求取数字n的逆置字符串;
- 判断字符串长度是否等于n,否的话在字符串后面填充空格,直到字符串的长度等于len
- 使用reverse 函数逆置字符串得到正常的字符串。
代码实现
#include<stdio.h>
void itoa(int n, char s[], int len);
void reverse(char s[]);
int main()
{
int n = (~0U >> 1) + 1, len = 20;
char s[100];
printf("The input number is: %d\n", n);
itoa(n, s, len);
printf("The output string is: %s\n", s);
return 0;
}
void itoa(int n, char s[], int len)
{
int sign, i, j;
sign = n;
i = 0;
do {
if (sign < 0)
s[i++] = -(n % 10) + '0';
else
s[i++] = n % 10 + '0';
} while ((n /= 10) != 0);
if (sign < 0)
s[i++] = '-';
while(i < len)
s[i++] = ' ';
s[i] = '\0';
reverse(s);
}
void reverse(char s[])
{
int i, j, c;
for (j = 0; s[j] != '\0'; j++)
;
for (i = 0, j--; i < j; i++, j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
编译运行
由运行结果可看出,得到的结果是预期的。