如何在C语言中进行打印输出

33

我是一个C语言的初学者,事实上这是我的第一个测试程序。

我无法弄清楚如何将这个数字打印到终端上。

#include <stdio.h>

int addNumbers(int a, int b)
{
    int sum = a + b;
    return sum;
}

int main(void)
{
    int a = 4;
    int b = 7;

    printf(addNumbers(a,b));
    return 0;
}

我确定在Java中,我只需要用System.out替换printf就可以工作了。 我之前尝试过搜索答案,但如果不知道要搜索什么,很难找到答案。


1
你可能会发现http://www.cppreference.com/wiki/非常有用,查看标准C库的部分。 - C. Ross
4个回答

56

13
可能需要添加一个换行符或 fflush(stdout) - John Bode

28

printf()的第一个参数始终是字符串值,称为格式控制字符串。该字符串可以是常规文本,如

printf("Hello, World\n"); // \n indicates a newline character
或者
char greeting[] = "Hello, World\n";
printf(greeting);

该字符串还可能包含一个或多个转换说明符; 这些转换说明符表明已传递额外的参数给printf()函数,并且它们指定如何将这些参数格式化为输出。例如,我可以将上述内容更改为

char greeting[] = "Hello, World";
printf("%s\n", greeting);

"%s"的格式控制符需要指向以0结尾的字符串的指针,并将其格式化为文本。

要输出有符号的十进制整数,请使用"%d"或"%i"格式控制符,例如

printf("%d\n", addNumber(a,b));

您可以混合使用转换说明符和常规文本,例如:

printf("The result of addNumber(%d, %d) is %d\n", a, b, addNumber(a,b));

请注意控制字符串中的转换说明符表示附加参数的数量类型。如果传递给printf()的附加参数的数量或类型与格式字符串中的转换说明符不匹配,则行为是未定义的。例如:

printf("The result of addNumber(%d, %d) is %d\n", addNumber(a,b));

如果不正确使用,会导致输出混乱或直接崩溃。

转换说明符还有许多其他标志,用于控制字段宽度、精度、填充、对齐和类型等。请查看方便的C参考手册,以获取完整列表。


3
我不能在良心上支持一个建议使用printf(<char*>)的答案。我们难道还没有学会始终明确指定格式字符串吗?不过,我喜欢这个答案的其余部分。 - Andrew Coleson
@AndrewColeson,我不明白你在说什么。这个答案使用了格式"Hello, world\n",它恰好没有包含任何替换和其他内容。该格式是“始终明确指定”的。 - Pascal Cuoq
1
@PascalCuoq 他在谈论的是 printf(greeting),在这个例子中是无害的,但仍然让我(和其他人)有点不舒服。 - Cubic
1
在学会跑步之前,必须先学会走路。在学习如何安全地使用printf(),更重要的是显然地安全地使用,以便审阅者可以将注意力集中在真正的问题上之前,必须学习printf()接受指向const char的指针,任何指向const char的指针都可以。在过程中跳过步骤只会导致“迷信式编程”,在C语言的情况下已经有太多了。对于将整数作为printf()的第一个参数传递的人来说,这个答案是正确的答案。 - Pascal Cuoq

1

在C语言中,你需要使用占位符来输出值,这和Java不同。因此,在C语言中,整数的占位符是d。此外,我建议你为函数参数选择不同的字符,以提高可读性,这也有助于编写更好、更安全的代码。最后,你可以跳过函数中的 int sum = a + b;,直接使用 return a+b;,从而得到最终的代码:

#include <stdio.h>

int addNumbers(int a, int b)
{
    return a+b;
}

int main()
{
    int num1 = 4;
    int num2 = 7;

    printf("%d",addNumbers(num1,num2));
    return 0;
}


0

printf比那要复杂得多。您必须提供格式字符串,然后是应用于格式字符串的变量。如果您只提供一个变量,C将假定它是格式字符串,并尝试打印出在其中找到的所有字节,直到它遇到终止nul(0x0)为止。

因此,如果您只给它一个整数,它将快乐地穿过存储整数的位置的内存,将那里的任何垃圾倒出到屏幕上,直到它碰巧遇到包含0的字节为止。

对于Java程序员来说,我想这是对C缺乏类型检查的相当粗鲁的介绍。相信我,这只是冰山一角。这就是为什么,虽然我赞赏您学习C扩展视野的愿望,但我强烈建议您尽一切可能避免在其中编写真正的程序。

(这也适用于阅读此内容的其他人。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接