摆脱C中的尾随数字

Tec*_*163 1 c

例如,

#include <stdio.h>

int main (int argc, const char * argv[]) {
    char out = printf("teststring");
    printf("%d\n", out);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

会回来的teststring10.任何人都知道如何摆脱10?

提前致谢.

Tim*_*ost 5

让我们看看你的代码:

#include <stdio.h>

int main (int argc, const char * argv[]) {
    char out = printf("teststring");
    printf("%d\n", out);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并改变它:

#include <stdio.h>

int main (int argc, const char * argv[]) {
    const char *str = "teststring";

    int out = printf("%s", str);
    printf("\nPrintf wrote %d bytes when printing %s\n", out, str);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译/运行已编辑的版本,您应该立即看到差异.修改str然后编译的长度并再次运行它.

现在,只需对原始代码进行微小更改:

#include <stdio.h>

int main (int argc, const char * argv[]) {
    char out = printf("teststring\n");
    printf("%d\n", out);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你现在可以看到,你正在打印两种不同的东西,并且out已经变成11,因为添加了换行符.实际上没有任何东西落后于此.然后更改%d%c(out在您的示例中为正确的格式说明符)并注意区别.ASCII(11)是一个垂直选项卡(见这里).YTMV(您的终端可能会有所不同).在这里,您打印了一个字符,而不是整数的字符表示.

实际的类型printf()返回是int,它是一个整数.这样做的原因是您确切知道printf()实际打印的字节数.这对于该系列函数来说是典型的,但对于函数更有用,snprintf()您可以知道它是否无法将任何给定格式的整个长度打印到缓冲区.请注意,返回类型是有符号的,它可以是负数,因此您选择存储其值的存储类型非常重要,特别是如果您使用该值而假设它大于或等于零.

这是一个方便的教程,可以格式化您可以与printf()函数系列一起使用的说明符.更重要的是,检查您正在使用的函数的返回类型.

我还建议你花一些时间阅读这本书,一定要在时间允许的情况下完成练习.它是C语言中最好的自学课程,练习很有趣.当你掌握了C语言后,再次练习练习......然后比较你的答案,开眼界:)