【问题标题】:How do I properly store characters in an array using read?如何使用读取将字符正确存储在数组中?
【发布时间】:2012-07-12 20:11:59
【问题描述】:

我写了以下代码,但我不明白为什么 read 没有按照我期望的方式存储字符:

char temp;
char buf[256];

    while(something)   
        read (in,&temp, 1);
        buf[strlen(buf)] = temp;
     }

如果我在阅读时打印tempbuf 数组的最后一个位置,有时它们不匹配。例如,字符可能是 'd' 但数组包含 % 或者字符是 0 而数组包含 .

我正在阅读少于 256 个字符,但这没关系,因为我正在阅读时打印。

我是否遗漏了一些明显的东西?

【问题讨论】:

    标签: c arrays string char buffer


    【解决方案1】:

    是的,您没有初始化 buf -- strlen(buf) 未定义。你应该像这样初始化它:

    buf[0] = 0;
    

    另外,最好跟踪长度而不是每次迭代都调用strlen 以避免Shlemiel the painter algorithm

    您还应该检查对 read(2) 的调用是否有错误——如果它返回 -1 或 0,您应该跳出循环,因为这意味着发生错误或者您到达了文件末尾/输入流。

    【讨论】:

    • 感谢您的回答。读取总是成功的,因为我总是打印临时变量。初始化也有助于解决我的问题。它通常在阅读 100 多个字符后发生。
    【解决方案2】:

    不要在这段代码中使用strlenstrlen 依赖于它的参数是 NULL 终止的 C 字符串。因此,除非您将 整个 缓冲区初始化为 0,否则此代码将不起作用。

    无论如何strlen 不是缓冲数据时使用的好选择,即使您知道您正在处理可打印的字符串数据,如果只是因为strlen 将遍历字符串每次只是为了得到你的长度。

    保留一个单独的计数器,命名为 e.g. numRead,仅在numRead 位置附加到buf,并将numRead 增加您读取的数量。

    【讨论】:

    • 感谢您的贡献。我已经使用空终止字符进行了适当的更正,但这并没有什么不同。字符的插入是按照您通常的预期完成的,因为我可以通过并排打印它们来观察这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2019-09-23
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多