strlen没有返回正确的字符数

时间:2019-01-21 02:54:15

标签: c string strlen

由于某种原因,当我输入/bin/echo后再输入enter时,strlen在这里说14应该是10。我似乎不知道为什么。

char buffer[BUF_SIZE];   // BUF_SIZE = 100
ssize_t readIn = read(STDIN_FILENO, &buffer, BUF_SIZE);

printf("strlen=%lu\n", strlen(buffer));

/字符有关吗?

编辑:

这是当我一次遍历一个字符时缓冲区输出的内容:

#0: c=/ / hex=2f
#1: c=b / hex=62
#2: c=i / hex=69
#3: c=n / hex=6e
#4: c=/ / hex=2f
#5: c=e / hex=65
#6: c=c / hex=63
#7: c=h / hex=68
#8: c=o / hex=6f
#9: c=
 / hex=a
#10: c= / hex=5
#11: c=? / hex=ffffff90
#12: c=? / hex=ffffffff
#13: c= / hex=7f

2 个答案:

答案 0 :(得分:7)

strlen()用于确定字符串的长度。在C语言中, string 的末尾带有 null字符,否则它不是字符串。除非读取的数据包含空字符,否则它不是字符串。

相反,请使用read()的返回值来确定读取的长度。要打印ssize_t,请转换为宽型,例如long longintmax_t(更好),因为ssize_t缺少指定的打印说明符。 1 2

注意:因为不需要&,所以将其从缓冲区中删除。

char buffer[BUF_SIZE];   // BUF_SIZE = 100
// ssize_t readIn = read(STDIN_FILENO, &buffer, BUF_SIZE);
ssize_t readIn = read(STDIN_FILENO, buffer, BUF_SIZE);

// printf("strlen=%lu\n", strlen(buffer));
printf("length = %lld\n", (long long) readIn);
// or
printf("length = %jd\n", (intmax_t) readIn);

1 Linux Programmer's Manual确实具有“ z:以下整数转换对应于size_t或               ssize_t参数”,因此其中的代码可以使用printf("length = %zd\n", readIn);

2 POSIX允许使用更宽的类型或signed analog of size_t

答案 1 :(得分:4)

问题在于read不会在buffer中放入空终止符。如果您使用valgrind运行程序,则几乎可以肯定会看到有关无效读取的错误,因为buffer未初始化。

您有几种选择:

  • 不要使用read,而是会自动添加空终止符的东西。
  • 使用read,但手动添加空终止符。 buffer[readIn] = '\0'是一个幼稚的解决方案(缺少错误和边界检查)。
  • buffer初始化为空终止符。如果您输入的内容大于BUF_SIZE,此功能将无效。请注意。
相关问题