gpt4 book ai didi

c - 为什么 strtok(line, "\n") **不** 用于去除 fgets() 留下的换行符

转载 作者:行者123 更新时间:2023-12-04 00:51:40 24 4
gpt4 key购买 nike

fgets() 是读取一行输入的安全函数,但它存储了读取的换行字节'\n'如果适合,则从数组中的文件中获取。

在许多(如果不是大多数)情况下,必须在进一步处理行内容之前删除此新行

可以使用几种简单的方法,但我看到了一个紧凑而棘手的建议:

strtok(line, "\n");    // strip the newline

为什么这个方法不正确,为什么它并不总是有效?

最佳答案

该方法很棘手,因为 strtok() 函数对全局隐藏状态变量有副作用。这可能会影响周围的代码并证明难以调试。

此外,还有一种简单的情况,strtok(line, "\n") 不会用空字节覆盖 '\n':如果行fgets() 读取的是一个空行,仅包含一个换行 字节。对于此内容,strtok() 将跳过初始的新行,搜索不存在的不同字符,并返回 NULL < strong>不修改数组。因此它不会去除新行

这是不使用 strtok(line, "\n") 去除换行字节的一个令人信服的理由。

当然可以解决这个问题,方法是写:

   if (*line == '\n')
*line = '\0';
else
strtok(line, "\n");

或者繁琐的一行代码:

    (void)(*line == '\n' ? (*line = '\0') : (strtok(line, "\n"), 0);
    if (!strtok(line, "\n")) *line = '\0';
    (void)(strtok(line, "\n") || (*line = '\0'));

但是代码不再紧凑而且还有其他副作用。

还有其他方法:

  • 使用明确的 for 语句:

      for (char *p = line; *p; p++) {
    if (*p == '\n')
    *p = '\0';
    }
  • 使用 strlen():

      size_t len = strlen(line);
    if (len > 1 && line[len - 1] == '\n') {
    line[--len] = '\0';
    }
    // len is the length if the stripped line
  • 使用 strchr():

      char *p = strchr(line, '\n');
    if (p) {
    *p = '\0';
    }
  • 在单行代码中使用 strcspn():

      line[strcspn(line, "\n")] = '\0';  // strip the newline if any.

关于c - 为什么 strtok(line, "\n") **不** 用于去除 fgets() 留下的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65893145/

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