比较指针
Comparing pointers
此代码用于将整数转换为字符数。我不明白为什么这个 while 循环的 condition:while(savestr < str) 在循环结束之前为真?!
while(savestr < str) {
temp = *str ;
*str-- = *savestr ;
*savestr++ = temp ;
contion 在哪些方面起作用? 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-- = '[=11=]' ;
while(savestr < str) {
temp = *str ;
*str-- = *savestr ;
*savestr++ = temp ;
}
}
这个循环:
do {
*str++ = (value % 10) + 48;
value = value / 10;
} while (value > 0);
通过获取最后一位数字 (value % 10
) 将 value
转换为数字,添加字符“0”的 ASCII 码 (48),并将总和放入 str
(*str =
)。它还递增 str
以指向内存中的下一个 space (*str++ =
)。添加“0”的代码是可行的,因为在 C 中,数字字符“0”到“9”的代码是连续的(在 ASCII 中:48、49、50、51、52、53、54、55、56、 57).所以,如果 value (value % 10
) 的最后一位是 5,则 48 加 5 得到 53,即“5”的代码。
没有理由在这里使用48
。代码最好写成*str++ = (value % 10) + '0';
。这有两个好处:它让 reader 清楚地知道我们正在为字符“0”添加代码;他们不需要记住或弄清楚 48 是什么。并且它消除了使用 ASCII 的假设;此代码将与其他字符代码方案一起使用。
然后 value = value / 10;
删除最后一位数字,如果有的话,保留 value
前面的数字。如果还有数字,while (value > 0)
继续循环。
当这个循环完成后,str
最初指向的内存中包含value
的数字字符。但是,它们是倒着写的,因为我们先写了最后一位,最后写了第一位。 str
现在指向字符的末尾(比最后一个字符高一个位置)。 savestr
中保存的值指向第一个位置。
此代码:
if (saveval < 0)
*str++ = '-';
*str-- = '[=11=]';
如果值为负则添加一个负号,然后添加一个空字符来标记字符串的结尾。它使 str
指向空字符之前的最后一个位置。
因为数字是倒序写的,所以我们必须把它们倒过来。这个循环是这样做的:
while (savestr < str) {
temp = *str;
*str-- = *savestr;
*savestr++ = temp;
}
savestr < str
为真,只要 savestr
指向分配内存中比 str
更早的位置。比较两个指针时,如果它们指向同一数组中的元素,则如果它指向较早的元素(数组索引较低的元素),则一个指针小于另一个指针。最初,savestr
指向字符串中的第一个字符,str
指向最后一个字符(在终止空字符之前)。
然后:
temp = *str;
记住str
指向的字符。
*str-- = *savestr;
将 savestr
指向的字符移动到 str
指向的位置,并且由于 --
,它递减 str
指向内存中较早的位置。
*savestr++ = temp;
将记住的字符放在 savestr
指向的位置,并且由于 ++
,它递增 savestr
以指向内存中的稍后位置。
因此,字符串中较早的字符与字符串中较晚的字符交换,并且 savestr
前进到字符串中较晚的位置,而 str
移动到字符串中较早的位置。最终,savestr
和str
相遇或交叉,while
条件savestr < str
变为假,此时循环停止,字符串已反转。
此代码用于将整数转换为字符数。我不明白为什么这个 while 循环的 condition:while(savestr < str) 在循环结束之前为真?!
while(savestr < str) {
temp = *str ;
*str-- = *savestr ;
*savestr++ = temp ;
contion 在哪些方面起作用? 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-- = '[=11=]' ;
while(savestr < str) {
temp = *str ;
*str-- = *savestr ;
*savestr++ = temp ;
}
}
这个循环:
do {
*str++ = (value % 10) + 48;
value = value / 10;
} while (value > 0);
通过获取最后一位数字 (value % 10
) 将 value
转换为数字,添加字符“0”的 ASCII 码 (48),并将总和放入 str
(*str =
)。它还递增 str
以指向内存中的下一个 space (*str++ =
)。添加“0”的代码是可行的,因为在 C 中,数字字符“0”到“9”的代码是连续的(在 ASCII 中:48、49、50、51、52、53、54、55、56、 57).所以,如果 value (value % 10
) 的最后一位是 5,则 48 加 5 得到 53,即“5”的代码。
没有理由在这里使用48
。代码最好写成*str++ = (value % 10) + '0';
。这有两个好处:它让 reader 清楚地知道我们正在为字符“0”添加代码;他们不需要记住或弄清楚 48 是什么。并且它消除了使用 ASCII 的假设;此代码将与其他字符代码方案一起使用。
然后 value = value / 10;
删除最后一位数字,如果有的话,保留 value
前面的数字。如果还有数字,while (value > 0)
继续循环。
当这个循环完成后,str
最初指向的内存中包含value
的数字字符。但是,它们是倒着写的,因为我们先写了最后一位,最后写了第一位。 str
现在指向字符的末尾(比最后一个字符高一个位置)。 savestr
中保存的值指向第一个位置。
此代码:
if (saveval < 0)
*str++ = '-';
*str-- = '[=11=]';
如果值为负则添加一个负号,然后添加一个空字符来标记字符串的结尾。它使 str
指向空字符之前的最后一个位置。
因为数字是倒序写的,所以我们必须把它们倒过来。这个循环是这样做的:
while (savestr < str) {
temp = *str;
*str-- = *savestr;
*savestr++ = temp;
}
savestr < str
为真,只要 savestr
指向分配内存中比 str
更早的位置。比较两个指针时,如果它们指向同一数组中的元素,则如果它指向较早的元素(数组索引较低的元素),则一个指针小于另一个指针。最初,savestr
指向字符串中的第一个字符,str
指向最后一个字符(在终止空字符之前)。
然后:
temp = *str;
记住str
指向的字符。*str-- = *savestr;
将savestr
指向的字符移动到str
指向的位置,并且由于--
,它递减str
指向内存中较早的位置。*savestr++ = temp;
将记住的字符放在savestr
指向的位置,并且由于++
,它递增savestr
以指向内存中的稍后位置。
因此,字符串中较早的字符与字符串中较晚的字符交换,并且 savestr
前进到字符串中较晚的位置,而 str
移动到字符串中较早的位置。最终,savestr
和str
相遇或交叉,while
条件savestr < str
变为假,此时循环停止,字符串已反转。