首先,如果你已经回答了,我道歉。我确实搜索了stackoverflow,但找不到类似的主题。(也许我的搜救力很弱)
我在C语言中编写了一个函数来修剪字符串中的空白字符。
我关心的是trim函数中源包含在目标中的最后一行测试用例和其他一些测试结果都很好复制源和目标位于同一内存中的字符串的全部或部分是否会导致奇怪的问题?
谢谢,
代码

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

void trim(char *line)
  {
  int  i, len = strlen(line);
  char *ptr, whitespace[] = " \t\n";

  // scan for first char which does not match a char in whitespace string
  for (i=0; i<len; i++)
    if (strchr(whitespace, line[i]) == NULL)
      break;
  ptr = line + i;

  // scan for last char which does not match a char in whitespace string
  for (i=len; i>0; i--)
    if (strchr(whitespace, line[i]) == NULL)
      break;
  line[i] + 1) = '\0';

  // copy result to line (this is the line relevant to the question)
  strncpy(line, ptr, len);
  }

int main(void)
  {
  int i;
  char test[4][64] = {
    "a line with no leading and trailing spaces",
    "  a line with some leading and trailing spaces  ",
    "\ta line with leading and trailing tabs\t",
    "\na line with leading and trailing newlines\n"
    };

  for (i=0; i<4; i++)
    {
    printf("test %d\nno trim: %s\n", i, test[i]);
    trim(test[i]);
    printf("trimmed: %s\n", test[i]);
    }
  return 0;
  }

最佳答案

如果你读了例如this strncpy reference你就会看到
如果字符数组重叠,则行为未定义。
您需要改用memmove,它被指定用来处理重叠的内存。

关于c - 在目的地包含源的地方使用strncpy(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33276068/

10-14 07:56