首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fgetc空终止符

fgetc空终止符
EN

Stack Overflow用户
提问于 2012-01-05 03:08:49
回答 4查看 1.4K关注 0票数 4

我正在K&R做一个练习:

编写一个程序detab,用适当的空格数替换输入中的制表符,直到下一个制表符停止。

到目前为止,这就是我所拥有的(w/o错误检查文件):

代码语言:javascript
复制
#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。我只是运气好吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-05 03:12:42

是的,你很幸运。为了避免这个问题,您可以使用fwrite,它不需要空终止符(因为您指定了要写入的字节数):

代码语言:javascript
复制
fwrite(buffer, 1, n, stdout);
票数 5
EN

Stack Overflow用户

发布于 2012-01-05 03:46:06

您可以告诉printf(...)要为给定字符串打印的(最大)字符数。

代码语言:javascript
复制
printf("%.*s\n", n, buffer);

参见打印件(3),“精度”一节:

一个可选的精度,以句号('.')的形式后面跟着一个可选的十进制数字字符串。代替十进制数字字符串,人们可以写"*“。指定精度在下一个参数.中给出,该参数必须是int类型。..。这个给..。从字符串中打印的字符的最大数目.转换。

printf ("%.*s\n", 5, "Hello, world!")的现场演示:http://ideone.com/KHKLl

票数 4
EN

Stack Overflow用户

发布于 2012-01-05 03:15:48

您可以使用以下方法初始化缓冲区:

代码语言:javascript
复制
memset(buffer, '\0', MAX_LENGTH + 1);

你不用担心空终止。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8737112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档