【问题标题】:Convert Integer to String using putchar() function and pointers使用 putchar() 函数和指针将整数转换为字符串
【发布时间】:2014-07-23 15:23:06
【问题描述】:

我有以下用于整数的 putchar() 函数:

void write_uint(unsigned n) {
    if (n / 10) write_uint(n / 10);
    putchar(n % 10 + '0');
}

void write_int(int n) {
    if (n < 0) {
        putchar('-');
        write_uint(-(unsigned)n);
    }
    else write_uint(n);
}

我正在尝试修改它以使用指针将整数转换为 char 数组,而不是写入控制台,如下所示:

void write_uint(unsigned n, char *p) {
    if (n / 10) write_uint(n / 10, p);
    *p++ = n % 10 + '0';
}

void write_int(int n, char *p) {
    if (n < 0) {
        *p++ = '-';
        write_uint(-(unsigned)n, p);
    }
    else write_uint(n, p);
}

int n = 123456789;
char *str = malloc(13000), *p = str;

write_int(n, p);
*p++ = '\n';

然后打印字符串,但我得到的只是一堆空行。

感谢任何帮助

【问题讨论】:

  • 调试器说什么?

标签: c pointers io char output


【解决方案1】:

write_int()write_uint() 中,您递增p,但因为您已经传递了char *p,所以该递增不会传回给调用者。所以在示例代码的最后一行中,p 仍然等于 str,所以你得到了空行。

您可以通过以下方式之一修改您的代码:

  1. 传递 char ** 而不是 char *

    void write_uint(unsigned n, char **p) {
        if (n / 10)
            write_uint(n / 10, p);
        **p = n % 10 + '0';
        (*p)++;
    }
    
    void write_int(int n, char **p) {
        if (n < 0) {
            **p = '-';
            (*p)++;
            write_uint(-(unsigned)n, p);
        }
        else
            write_uint(n, p);
    }
    
    ....
    write_int( n, &p );
    *p++ = '\n';
    
  2. 返回修改后的指针

    char *write_uint(unsigned n, char *p) {
        if (n / 10)
            p = write_uint(n / 10, p);
        *p++ = n % 10 + '0';
        return p;
    }
    
    char *write_int(int n, char *p) {
        if (n < 0) {
            *p++ = '-';
            p = write_uint(-(unsigned)n, p);
        }
        else 
            p = write_uint(n, p);
        return p;
    }
    
    ....
    p = write_int( n, p );
    *p++ = '\n';
    

当然,正如#pm100 所说,你也应该在'\n'之后添加一个NUL

【讨论】:

  • 该代码在一个循环中,我在最后做 *p = '\0' 。我仍然使用你的第二个代码得到空行
  • 它在我的测试程序中工作得非常好......你真的检查str(不是p)吗?
  • 你明白了。我没有以正确的方式调用该函数(代码中的“p = call”)。谢谢!
【解决方案2】:

你当然需要零终止str

*p++ = 0;

或者如果你喜欢

*p++ = '\0';

【讨论】:

  • 该代码在一个循环中,我在最后做 *p = '\0'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 2010-11-23
  • 2021-02-13
相关资源
最近更新 更多