【问题标题】:String doesn't show when new line removed删除新行时字符串不显示
【发布时间】:2019-03-15 17:01:08
【问题描述】:

所以我使用 fgets 从文件中获取字符串,然后将它们添加到数组中。但在我将它们添加到数组之前,我想去掉“\n”。这就是我用的那个

strtok(str,"\n");
array[i] = strdup(str);

数组初始化于 char *array[32];

现在功能完美运行,我可以使用数组和我不想使用的元素。但是,每当我尝试打印元素时,它都无法正常工作。

例如array[i] = hello

printf("%s:TEST",array[i]);

将打印

:TEST

但是

printf("%s\n:TEST",array[i]);

将打印

hello
:TEST

我需要它在同一行,所以我不能使用 \n,而且很奇怪它只在后面有新行时才会打印。

编辑:不是 strdup(strok) 而是 strdup(str)

编辑: 完整代码示例:

char *array[32]
char holder[32]


FILE *fp = fopen("file.txt","r");

int i = 0;

while(fgets(holder, 100, fp)){
    strtok(holder,"\n");
    array[i] = strdup(holder);
    i++;

}
fclose(fp);

printf("word: %s",words[1]);

array[i] 不会打印,除非它后面有一个 '\n',如上所述

编辑:添加打印功能 文本文件格式

string1
string2
string3

【问题讨论】:

  • strdup(strok) - 嗯? strtok 是一个函数。请显示minimal reproducible example
  • @RichardChambers 是的,但所描述的行为是关于具有printf部分 输出
  • @RichardChambers 缺少的部分是 before ":TEST" 所以它不可能是缓冲区刷新问题。
  • 如果没有 MCVE,那就是猜测。也许字符串包含一个 CR(回车),因此第一部分被覆盖,而没有输出 LF(换行符,换行符)。函数strtok 正在寻找'\n',但假设字符串包含'\r'。尝试打印字符串中每个字符的值(使用%d 格式规范)。
  • 一个minimal reproducible example 价值数百字。无论如何,如果没有它,您的问题就会结束。所以,请不要再浪费我们和您的时间,然后发布一个。

标签: c


【解决方案1】:

C 库函数 char *strtok(c​​har *str, const char *delim) 使用分隔符 delim 将字符串 str 分解为一系列标记。因此,它不是将字符串视为引用而是将其视为值的函数。因此,当您执行以下操作时:

strtok(str, "\n");

str 将具有与以前相同的值。如果您想要第一个标记,例如 str 值,直到它第一次找到“\n”,您必须执行类似的操作。

array[i] = strtok(str, "\n");

char *token = strtok(str, "\n");
array[i] = strdup(token);

或类似的东西。

代码:

#include <string.h>
#include <stdio.h>

int main () {
  char buff[100];
  char *array[32];

  FILE *fp = fopen("file.txt","r");

  int i = 0;
  while(fgets(buff, 100, fp)){
    char* token = strtok(buff,"\n");
    array[i] = strdup(token);
    printf("%s:TEST\n", array[i]);
    i++;
  }

  fclose(fp);
  return(0);
}

文件.txt

HELLO
BYE

输出:

HELLO:TEST
BYE:TEST

【讨论】:

  • 不幸的是,这给出了相同的结果。
  • 您的解释不正确:buffstrtok 修改,'\n''\0' 覆盖,因此使用strtok()buff 的返回值应该给出相同的行为。问题出在其他地方。
【解决方案2】:

您在发布的代码片段中有多个问题:

  • array 没有在char *array[32]初始化,它只是以这种方式定义,如果该定义出现在函数体内,则未初始化。顺便说一句,代码片段中的定​​义中缺少;

  • holder 的大小是32,但您将100 传递给fgets() 会导致潜在的缓冲区溢出。

  • printf("%s:TEST",array[i]); 不在您的代码中,您没有发布违规代码。
  • 最终输出,printf("word: %s",words[1]); 使用了一个未定义的对象words,如果只输入一个单词,索引1 可能超出范围。

您必须发布带有违规行为的实际程序。代码片段与您描述的行为不一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2021-06-30
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多