c语言 - 比较指针



此代码用于将整数转换为字符数。我不明白为什么这个 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移动到字符串中的较早字符。最终,savestrstr相遇或交叉,while条件savestr < str变为假,此时循环停止,字符串已反转。

最新更新