gpt4 book ai didi

c - 未找到 read() 结束行导致代码输出奇怪的符号

转载 作者:太空宇宙 更新时间:2023-11-04 07:56:34 26 4
gpt4 key购买 nike

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) {
char buf[10];
int ret;
while(1) {
ret = read(0, buf, sizeof buf);
printf("%s\n", buf);
}

return(0);
}

基本上,情况是这样的:

$ gcc -Wall above.c
$ ./a.out
h
h
@

a
a
&
^C
$

如何才能不打印这个特殊字符?我不确定如何解决这个问题。我尝试制作 buf[10] = '\0' 但我仍然遇到同样的错误。

最佳答案

你有几个错误,为什么不使用read的返回值呢?

您可以简单地在 "%.*s" 中使用它格式说明符,如

         printf("%.*s\n", ret, buf);

但是……

  • 你必须检查ret < 0错误。
  • 你必须检查ret == 0文件结束条件。
  • read(2) never 终止用 \0 读取的字符序列char,所以你不能使用任何 str*它的函数(我使用了只打印第一个 ret 字符的技巧,因为 ret 变量告诉我没有更多,所以我不会落后于最后一个字符读取)但是这种方法会吃掉所有字符在实际 \0 之后阅读在输入文件(或缓冲区)中,直到 ret -esim 字符。那是因为 %*s格式在指定的 ret 之前停止如果它找到字符串终止符 null char 的值。

最好用write(2)fwrite(2)read(2) ,如:

         write(1, buffer, ret);

作为read(2) , write(2)不对待\0作为字符串终止符,如果你有一些 \0缓冲区中的字符,它将打印它们,就好像它们是普通字符一样。如果您确实希望从输入中逐字输出(如 cat(1) 命令),这一点很重要

关于c - 未找到 read() 结束行导致代码输出奇怪的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49623290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com