传递给接受char参数的函数时,打印int的实际值

时间:2015-04-21 06:07:13

标签: c char int

我有一个函数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。这是一个家庭作业,所以我不能改变这个功能的原型。

6 个答案:

答案 0 :(得分:2)

如果您应该使用PutChar()函数输出单位数字,则可以通过添加char将其转换为具有适当值的'0',如单:

PutChar(1, 1, x + '0');

如果您应该在传递小整数时修改PutChar()函数以输出数字,那么也可以这样做。

假设您的终端支持ASCII或基于ASCII的某些编码,例如Latin1或UTF-8,则32(空格)以下的字符是控制字符。在给定位置它们放在屏幕上没有多大意义。因此,您可以修改PutChar()以专门处理char0之间的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); } } 会导致缓冲区溢出,导致sprintfrow的值较大。您应该使用col和更大的缓冲区。您可以进一步简化代码并只调用一次snprintf()

write

答案 1 :(得分:0)

您需要使用sprintf()来实现此目的。在那里,你可以使用

  • %c打印char
  • %d打印int值。

但是,您需要更改逻辑以包含标志以指示其中一种情况。

答案 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