函数内部字符串操作

问题描述 投票:0回答:1

为什么把

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;
    }
}   

我希望输出是相同的,因为(我认为,至少)我将指针作为参数传递给两个函数。

c char reverse c-strings function-definition
1个回答
1
投票

在函数内的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;
}   
© www.soinside.com 2019 - 2024. All rights reserved.