关于printf语句的困惑

时间:2015-06-02 21:18:25

标签: c printf

所以我正在运行此代码

#include<stdio.h>
int add(int x, int y)
{
return printf("%*c%*c",x ,' ',y,' ');

}
int main()
{
printf("Sum = %d", add(3,4));
return 0;
}

似乎无法理解以下陈述如何运作

return printf("%*c%*c",x ,' ',y,' ');  

所以我尝试编写一个简单的代码

int x=3;
printf("%*c",x);

我得到了一个奇怪的特殊字符(前面有一些空格)作为输出

printf("%*c",x,' ');

我没有输出。我不知道发生了什么事?请帮忙。谢谢。

2 个答案:

答案 0 :(得分:4)

此代码

int x=3;
printf("%*c",x,'a');

使用可为每个输入参数设置的最小字符宽度printf

以上操作是打印出a字符,但指定最小宽度为x个字符 - 因此输出将是前面有2个空格的a字符。

*说明符告诉printf从此输入参数形成的输出字符串部分的宽度将是x个字符最小宽度,其中x必须通过作为要打印的变量的附加参数 previous 。额外宽度(如果需要)由空白空间输出输出要打印的变量。在这种情况下,宽度为3,因此输出字符串是(不包括用于说明空格的引号)

"  a" 

使用您的代码

printf("%*c",x);

您已通过长度值,但忘记实际传递您要打印的变量。

所以这段代码

return printf("%*c%*c",x ,' ',y,' ');

基本上是打印空格字符,但最小宽度为x个字符(代码x = 3),然后用最少y个字符打印空格字符(在你的字符中)代码y = 4)。

结果是您正在打印7个空格字符。此长度是printf(因此您的add函数)的返回值,该值由

的输出确认
Sum = 7

来自printf内的main()

如果您将代码更改为

return printf("%*c%*c",x ,'a',y,'b');

你会看到字符串(显然不包括引号)

"  a    b" 

打印,这将使正在发生的事情变得更加清晰。

答案 1 :(得分:2)

尝试以正确的方式打印。 import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import javax.swing.*; @SuppressWarnings("serial") public class SimpleNumberLinePanel extends JPanel { private static final int PREF_W = 800; private static final int PREF_H = 300; private static final int GAP = 10; private static final int START = 0; private static final int END = 12; private static final int VERT_LINE_HEIGHT = 20; private static final Font FONT = new Font(Font.MONOSPACED, Font.BOLD, 14); private static final int TEXT_GAP = 2; @Override protected void paintComponent(Graphics g) { // call super method super.paintComponent(g); int width = getWidth(); int height = getHeight(); // initialize these guys each time paintComponent is called int x1 = GAP; int y1 = height / 2; int x2 = width - 2 * GAP; int y2 = y1; g.drawLine(x1, y1, x2, y2); for (int i = START; i <= END; i++) { int x = (i * (x2 - x1)) / (END - START) + GAP; drawNumberAndLine(g, i, x, y1, VERT_LINE_HEIGHT); } } private void drawNumberAndLine(Graphics g, int number, int x, int y, int vertLineHeight) { int x1 = x; int y1 = y; int x2 = x; int y2 = y - vertLineHeight; g.drawLine(x1, y1, x2, y2); String text = String.valueOf(number); g.setFont(FONT); FontMetrics fontMetrics = g.getFontMetrics(); int textX = x - fontMetrics.stringWidth(text) / 2; int textY = y + fontMetrics.getHeight() + TEXT_GAP; g.drawString(text, textX, textY); } @Override // make GUI bigger public Dimension getPreferredSize() { if (isPreferredSizeSet()) { return super.getPreferredSize(); } return new Dimension(PREF_W, PREF_H); } private static void createAndShowGui() { JFrame frame = new JFrame("Number Line"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new SimpleNumberLinePanel()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 用于打印整数,%d用于打印字符。

在您的代码中:

%c

int x=3; printf("%*c",x); 是char将获得多少空格,你写的是3.但是你没有把你要打印的字符打印出来,所以它会打印垃圾。

当你写:

x

在3个字符空间内打印空格printf("%*c",x,' '); 字符。 你做的时候也一样 ' ' - 只有7个空格。结果是正确的,因为printf("%*c",x, ' ',y,' ');返回它写入的字符数。

查看here以了解额外的printf格式。