此代码用于将整数转换为字符数。我不明白为什么这个 while 循环的条件:while(savestr <str)>直到该循环结束才会成立?!
while (savestr < str) {
temp = *str ;
*str-- = *savestr ;
*savestr++ = temp ;
这个构思在什么方面起作用?ASCII 值?那么在ASCII值方面,循环条件是如何工作的?!
代码如下:
#include <stdio.h>
#include <conio.h>
void int_to_ascii( int , char *);
int main()
{
int number ;
char s[10] ;
clrscr();
printf(" enter a number :");
scanf("%d", &number) ;
int_to_ascii(number, s) ;
printf(" the string value is: %s ", s);
getch();
return 0;
}
//**********************************
void int_to_ascii(int value, char *str)
{
int saveval = value ;
char temp, *savestr = str ;
if(value < 0)
value *= -1 ;
do{
*str++ = (value % 10) + 48 ;
value = value / 10 ;
} while(value > 0);
if (saveval < 0)
*str++ = '-' ;
*str-- = ' ' ;
while(savestr < str) {
temp = *str ;
*str-- = *savestr ;
*savestr++ = temp ;
}
}
这个循环:
do {
*str++ = (value % 10) + 48;
value = value / 10;
} while (value > 0);
通过取最后一个数字 (value % 10
),添加字符"0"(48) 的 ASCII 代码并将总和放入str
(*str =
) 将value
转换为数字。它还递增str
以指向内存中的下一个空间 (*str++ =
)。添加"0"的代码有效,因为在 C 中,数字字符"0"到"9"的代码是连续的(在 ASCII 中:48、49、50、51、52、53、54、55、56、57)。因此,如果值(value % 10
)的最后一位数字是5,则将5加到48得到53,这是"5"的代码。
这里没有理由使用48
。代码最好写成*str++ = (value % 10) + '0';
。这有两个好处:它让读者清楚地知道我们正在为字符"0"添加代码;他们不需要记住或弄清楚 48 是什么。它消除了正在使用 ASCII 的假设;此代码将与其他字符代码方案一起使用。
然后value = value / 10;
删除最后一个数字,留下value
的早期数字,如果有的话。如果还有更多数字,while (value > 0)
继续循环。
完成此循环后,str
最初指向的内存包含value
的数字字符。但是,它们是倒退的,因为我们先写了最后一个数字,最后写了第一个数字。str
现在指向字符的末尾(比最后一个位置高一个位置)。以savestr
为单位保存的值指向第一个位置。
此代码:
if (saveval < 0)
*str++ = '-';
*str-- = ' ';
如果值为负数,则添加减号,然后添加空字符以标记字符串的末尾。它留下指向空字符之前的最后一个位置str
。
由于数字是按相反顺序编写的,因此我们必须颠倒它们。此循环执行以下操作:
while (savestr < str) {
temp = *str;
*str-- = *savestr;
*savestr++ = temp;
}
只要savestr
指向分配的内存中比str
更早的位置,savestr < str
就是正确的。比较两个指针时,如果它们指向同一数组中的元素,则一个指针指向较早的元素(数组索引较低的元素)时,一个指针比另一个指针少。最初,savestr
指向字符串中的第一个字符,str
指向最后一个字符(在终止 null 字符之前)。
然后:
temp = *str;
记得str
指向的角色。*str-- = *savestr;
将savestr
指向的字符移动到str
指向的位置,并且由于--
,它会递减str
指向内存中的较早位置。*savestr++ = temp;
将记住的字符放在savestr
指向的位置,并且由于++
,它会savestr
递增以指向内存中的稍后位置。
因此,字符串中较早的字符与字符串中较晚的字符交换,并且savestr
在字符串中前进到后面,而str
移动到字符串中的较早字符。最终,savestr
和str
相遇或交叉,while
条件savestr < str
变为假,此时循环停止,字符串已反转。