【问题标题】:Strncpy (String C programming) doesn't perform well the second timeStrncpy(字符串 C 编程)第二次表现不佳
【发布时间】:2017-03-07 09:56:19
【问题描述】:

为什么第二个 strncpy 在打印时会给出不正确的奇怪符号? 我需要类似 fflush(stdin) 的东西吗?

请注意,我使用 scanf("%s",aString); 来读取整个字符串,输入的输入首先以空格开头,以便正常工作。

void stringMagic(char str[], int index1, int index2)
{
    char part1[40],part2[40];

    strncpy(part1,&str[0],index1);
    part1[sizeof(part1)-1] = '\0';//strncpy doesn't always put '\0' where it should
    printf("\n%s\n",part1);

    strncpy(part2,&str[index1+1],(index2-index1));
    part2[sizeof(part2)-1] = '\0';
    printf("\n%s\n",part2);
}

编辑 问题似乎出在

scanf("%s",aString);

因为当我使用 printf("\n%s",aString); 并且我输入了类似“Hello world”之类的内容时,我只能得到输出“Enough”,因为'\0'。

如何正确输入包含空格的整个句子?读字符?

现在我使用: fgets (aString, 100, stdin); (Reading string from input with space character?)

【问题讨论】:

  • 检查限制 (index1 + 1) 和 (index2 - index1) 实际上是否在 char 数组 part2 的大小范围内。这可能是造成它的原因。然后,检查 str 是否真的格式正确。
  • fflush(stdin) 是未定义的行为,所以你不应该在任何程序中这样做。
  • 但到目前为止,这在我的程序中运行良好。如果你知道另一种选择,我会很高兴听到它(因为有时在第一次 scanf 之后另一个 scanf 会失败)

标签: c string strncpy


【解决方案1】:

为了使用%s 正确打印字符序列,它需要以空值结尾。此外,终止符号应紧跟在要打印的最后一个符号之后。但是,代码中的此部分:part2[sizeof(part2)-1] = '\0'; 始终将part2 的第 39 个单元格设置为 0 字符。请注意,sizeof(part2) 将始终返回为 part2 分配的内存大小,在本例中为 40。此函数的值不依赖于 part2 的内容。

您应该改为将 part2 中的 (index2-index1) 字符设置为 0。您知道您已将这么多字符复制到 part2,因此您知道结果字符串的预期长度是多少。

【讨论】:

  • 但是为什么第 1 部分工作得很好呢?我也在那里使用相同的代码行。但我明白你的意思..
  • @HoPam 我的猜测是 - 纯粹的运气。如果您没有正确设置空终止字符,则会打印一些随机数据。然而,有意义的内容之后的第一个符号可能是\0。此数据未初始化,因此可以是任何内容。
  • 会尝试你的方法并让你知道!谢谢!
猜你喜欢
  • 2015-12-29
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多