摆脱C中的尾随数字

时间:2010-05-29 11:21:10

标签: c

例如,

#include <stdio.h>

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

    return 0;
}

将返回teststring10。任何人都知道如何摆脱10?

提前致谢。

5 个答案:

答案 0 :(得分:5)

让我们看看你的代码:

#include <stdio.h>

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

    return 0;
}

并改变它:

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

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

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

#include <stdio.h>

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

    return 0;
}

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

printf()返回的实际类型int,这是一个整数。这样做的原因是您确切地知道实际打印了多少字节printf()。这是典型的函数系列,但对snprintf()等函数更有用,因此您可以知道它是否无法将任何给定格式的整个长度打印到缓冲区。请注意,返回类型为 已签名 ,它可能为负数,因此您选择存储其值的存储类型非常重要,尤其是当您使用该值时假设它大于或等于零。

以下是handy tutorial格式说明符,可用于printf()函数系列。更重要的是,检查您正在使用的函数的返回类型。

我还建议spending some quality time with this book,请务必在时间允许的情况下完成练习。它是C语言中最好的自学课程,练习很有趣。当你掌握了C语言后,再次练习练习。然后比较你的答案,开眼界:)

答案 1 :(得分:0)

10是因为

printf("%d\n", out);

printf返回写入输出流的字符数 “teststring”的长度,10分配给“out” 并且你打印输出的值 - 所以10打印出来。

答案 2 :(得分:0)

int main(int argc, char *argv[])
{
    const char *str = "This is a constant string";

    printf("%s\n", str);

    return 0;
}

%s是字符串的格式说明符。 %d是整数的十进制表示的格式说明符。 printf将返回写入输出的字符数。

答案 3 :(得分:0)

#include <stdio.h>

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

    return 0;
}

假设你想为一个函数分配“out”(我认为你已经说过了):

#include <stdio.h>

int main (int argc, const char * argv[]) 
{
    char *out = NULL;

    out = funcReturns("teststring");

    printf("%s\n", out);

    return 0;
}

如果在返回“teststring”的函数内部分配内存,那么我认为你需要使返回值为static。例如(代码未经测试):

char *funcReturns(char *returnStr)
{
    static char *returnThis = NULL;

    returnThis = strdup(returnStr);

    return returnThis;
}

答案 4 :(得分:0)

int printf ( const char * format, ... );

成功时,将返回写入的字符总数。

执行此操作时:

char out = printf("teststring");

字符串“teststring”将打印在您的屏幕上,值10将是 atrib to variable out。

请注意,一旦你没有在字符串的末尾放置sufix'\ n',打印光标将保留在“teststring”末尾的当前行。

所以,当你执行printf(“%d \ n”,out)时;在下一行,程序将在“teststring”之后打印值10,您将在屏幕上看到“teststring10”。

如果你真的想摆脱10只删除行printf(“%d \ n”,out);来自你的代码...

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

    return 0;
}