为什么把
reverse()
放在main()
里面打印12345
而把reverse()
作为itoa()
定义的最后一个语句会产生54321
?
#include <stdio.h>
#include <string.h>
void itoa(long n, char *s);
void reverse(char *s);
int main() {
int n = 12345;
char s[10];
itoa(n, s);
printf("%s\n", s);
return 0;
}
void itoa(long n, char *s) {
int i;
while (n != 0) {
*s++ = n % 10 + '0';
n /= 10;
}
*s = '\0';
reverse(s);
}
void reverse(char *s) {
int i, temp, len = strlen(s);
for (i = 0; i < len / 2; i++) {
temp = s[len - 1 - i];
s[len - 1 - i] = s[i];
s[i] = temp;
}
}
我希望输出是相同的,因为(我认为,至少)我将指针作为参数传递给两个函数。
在函数内的while循环之后
itoa
void itoa(long n, char *s) {
int i;
while (n != 0) {
*s++ = n % 10 + '0';
n /= 10;
}
*s = '\0';
reverse(s);
}
指针
s
指向字符串的零字符'\0'
。所以函数reverse
没有反转。
需要在函数
itoa
中使用一个中间指针,并将原始指针传递给函数reverse
。
注意函数
itoa
的参数应该是无符号整数类型,因为函数不考虑其参数的符号。
此外,该函数不处理等于
0
的参数。
函数可以看成下面的样子
char * itoa( unsigned int n, char *s )
{
const unsigned int Base = 10;
char *p = s;
do
{
*p++ = n % Base + '0';
} while ( n /= Base );
*p = '\0';
return reverse( s );
}
函数
reverse
看起来像
char * reverse( char *s )
{
for ( size_t i = 0, n = strlen( s ); i < n / 2; i++ )
{
char c = s[n - 1 - i];
s[n - 1 - i] = s[i];
s[i] = c;
}
return s;
}