我正在K&R做一个练习:
编写一个程序detab,用适当的空格数替换输入中的制表符,直到下一个制表符停止。
到目前为止,这就是我所拥有的(w/o错误检查文件):
#include <stdio.h>
#define tab 2
#define MAX_LENGTH 1000
int main(int argc, char **argv)
{
FILE *fp = fopen(argv[1], "r+");
int c, n;
char buffer[MAX_LENGTH + 1];
for (n = 0; n < MAX_LENGTH && (c = fgetc(fp)) != EOF; ++n) {
if (c == '\t') {
for (int x = 0; x < tab; ++x)
buffer[n++] = ' ';
--n;
}
else
buffer[n] = c;
}
//buffer[n] = '\0';
//rewind(fp);
//fputs(buffer, fp);
printf("%s\n", buffer);
fclose(fp);
return 0;
}这似乎是可行的,但我想知道为什么在最后不需要\0。我只是运气好吗?
发布于 2012-01-05 03:12:42
是的,你很幸运。为了避免这个问题,您可以使用fwrite,它不需要空终止符(因为您指定了要写入的字节数):
fwrite(buffer, 1, n, stdout);发布于 2012-01-05 03:46:06
您可以告诉printf(...)要为给定字符串打印的(最大)字符数。
printf("%.*s\n", n, buffer);参见打印件(3),“精度”一节:
一个可选的精度,以句号('.')的形式后面跟着一个可选的十进制数字字符串。代替十进制数字字符串,人们可以写"*“。指定精度在下一个参数.中给出,该参数必须是int类型。..。这个给..。从字符串中打印的字符的最大数目.转换。
printf ("%.*s\n", 5, "Hello, world!")的现场演示:http://ideone.com/KHKLl。
发布于 2012-01-05 03:15:48
您可以使用以下方法初始化缓冲区:
memset(buffer, '\0', MAX_LENGTH + 1);你不用担心空终止。
https://stackoverflow.com/questions/8737112
复制相似问题