所以我正在运行此代码
#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,' ');
我没有输出。我不知道发生了什么事?请帮忙。谢谢。
答案 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
格式。