我有一个函数PutChar(int, int, char)
,它在给定的行和列上打印出给定的char。如果我将它传递给char,此函数可以正常工作。我还希望能够在0-9范围内传递一个int到函数,并让它打印实际的int值。例如,我想以下代码打印int x:
int x = 5;
PutChar(1, 1, x);
void PutChar(int row, int col, char ch) {
char str[20];
sprintf(str, "\e[%d;%dH", row, col); // move cursor to row-col
write(1, str, strlen(str));
write(1, &ch, 1);
}
我尝试在将int传递给函数时转换为char,但它会输出奇怪的字符。
编辑:可以打印的整数范围是0-9。这是一个家庭作业,所以我不能改变这个功能的原型。
答案 0 :(得分:2)
如果您应该使用PutChar()
函数输出单位数字,则可以通过添加char
将其转换为具有适当值的'0'
,如单:
PutChar(1, 1, x + '0');
如果您应该在传递小整数时修改PutChar()
函数以输出数字,那么也可以这样做。
假设您的终端支持ASCII或基于ASCII的某些编码,例如Latin1或UTF-8,则32(空格)以下的字符是控制字符。在给定位置将它们放在屏幕上没有多大意义。因此,您可以修改PutChar()
以专门处理char
和0
之间的9
值,而不会与实际ASCII字符32及更高版本上的当前行为发生冲突(如果{{ 1}}已签名):
char
另请注意,您的程序不安全:void PutChar(int row, int col, char ch) {
char str[20];
sprintf(str, "\e[%d;%dH", row, col); // move cursor to row-col
write(1, str, strlen(str));
if (ch >= 0 && ch <= 9)
ch += '0'; // convert small integer to digit
write(1, &ch, 1);
}
void Test(void) {
for (int x = 0; x < 10; x++) {
PutChar(x + 1, x + 1, x);
}
}
会导致缓冲区溢出,导致sprintf
和row
的值较大。您应该使用col
和更大的缓冲区。您可以进一步简化代码并只调用一次snprintf()
:
write
答案 1 :(得分:0)
答案 2 :(得分:0)
对我来说,让PutChar()
函数打印除char之外的东西似乎不是一个好主意。
如果需要打印int,请编写一个完全符合该函数的函数PutInt()
。您可能需要另一个函数PutString()
才能实现这一目标。
完成后,您可能会重写标准库的大部分内容......
答案 3 :(得分:0)
由于整数范围是0-9,我可以添加&#39; 0&#39;我正在传递的论点。例如:
int x = 5;
PutChar(1, 1, x + '0');
答案 4 :(得分:0)
如果您可行,可以在PutChar实施中使用VA_ARGS:
PutChar(int row, int col, char* formatString, ...) {
sprintf(str, "\e[%d;%dH", row, col); // move cursor to row-col
va_list args;
va_start (args, format);
vprintf (format, args); // untested example
va_end (args);
}
答案 5 :(得分:0)
在调用PutChar()
之前,如果要输出0..9范围内的int
,则向该字符添加0x30。如果要输出任何其他char
,则不要添加0x30