【问题标题】:Length of string with \0 in it in CC中带有\ 0的字符串长度
【发布时间】:2019-03-17 12:28:52
【问题描述】:

好吧,我将用户的输入读为:

scanf("%[^\n]", message); 

我现在初始化字符消息[100] ="";,在另一个函数中我需要找出消息中输入的长度,我用strlen()很容易做到了,不幸的是,当我稍后在终端中这样做时它不能正常工作

echo -e "he\0llo" | .asciiart 50 

它将读取整个输入,但 strlen 只会返回长度 2。

还有其他方法可以找出输入的长度吗?

【问题讨论】:

  • strlen() 在 char 数组中搜索第一次出现的 \0,因此无法搜索填充有 \0 字符的任意数组。

标签: c input strlen


【解决方案1】:

根据定义 strlen 在空字符处停止

您必须在读取字符串后计数/读取到 EOF 和/或换行符,而不是计数到空字符

正如%n 的评论中所说,允许获取读取的字符数,例如:

#include <stdio.h>

int main()
{
  char message[100] = { 0 };
  int n;

  if (scanf("%99[^\n]%n", message, &n) == 1)
    printf("%d\n", n);
  else
    puts("empty line or EOF");
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -g c.c
pi@raspberrypi:/tmp $ echo "" | ./a.out
empty line or EOF
pi@raspberrypi:/tmp $ echo -n "" | ./a.out
empty line or EOF
pi@raspberrypi:/tmp $ echo -e "he\0llo" | ./a.out
6
pi@raspberrypi:/tmp $ 

如您所见,无法区分空行和 EOF(即使查看 errno

你也可以使用ssize_t getline(char **lineptr, size_t *n, FILE *stream);

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char *lineptr = NULL;
  size_t n = 0;
  ssize_t sz = getline(&lineptr, &n, stdin);

  printf("%zd\n", sz);

  free(lineptr);
}

但在这种情况下,可能的换行符会被获取并计数:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -g c.c
pi@raspberrypi:/tmp $ echo -e "he\0llo" | ./a.out
7
pi@raspberrypi:/tmp $ echo -e -n "he\0llo" | ./a.out
6
pi@raspberrypi:/tmp $ echo "" | ./a.out
1
pi@raspberrypi:/tmp $ echo -n "" | ./a.out
-1

【讨论】:

  • @chux 你说的很对,谢谢你的评论,我编辑了我的答案(我很惊讶我没有把限制设置为 99 个字符,我总是设置限制并告诉别人这样做^^)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多