C如何知道我的字符串的结尾?

vau*_*ech 3 c string

我有一个程序,我想从字符串中删除空格.我想找到一个优雅的方式来做到这一点,所以我发现下面的(我已经改变了它一点,所以它可能是更好的可读性)代码在一个论坛:

char* line_remove_spaces (char* line)
{
    char *non_spaced = line;
    int i;
    int j = 0;
    for (i = 0; i <= strlen(line); i++)
    {
        if ( line[i] != ' ' )
        {
            non_spaced[j] = line[i];
            j++;
        }
    }
    return non_spaced;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,该函数采用一个字符串,并使用相同的已分配内存空间,仅选择非间隔字符.有用!

无论如何,根据维基百科,C中的字符串是"以空字符结尾的字符串 ".我总是这么想,一切都很好.但问题是:我们在non_spaced字符串的末尾没有放置"null-character" .并且不知何故,编译器知道它以"non_spaced"字符串改变的最后一个字符结束.怎么知道的?

cod*_*ict 10

魔术不会发生这种情况.你的代码中有:

for (i = 0; i <= strlen(line); i++)
              ^^
Run Code Online (Sandbox Code Playgroud)

循环索引i一直运行到strlen(line)该索引,在字符数组中有一个空字符,这也会被复制.因此,您的最终结果在所需索引处具有零字符.

如果你有

for (i = 0; i < strlen(line); i++)
              ^^
Run Code Online (Sandbox Code Playgroud)

然后你必须手动把nul字符放在:

for (i = 0; i < strlen(line); i++)
{
    if ( line[i] != ' ' )
    {
        non_spaced[j] = line[i];
        j++;
    }
}
// put nul character
line[j] = 0;
Run Code Online (Sandbox Code Playgroud)


Lun*_*din 5

其他人已经回答了你的问题,但这是相同代码的更快,也许更清晰的版本:

void line_remove_spaces (char* line)
{
  char* non_spaced = line;

  while(*line != '\0')
  {
    if(*line != ' ')
    {
      *non_spaced = *line;
      non_spaced++;
    }

    line++;
  }

  *non_spaced = '\0';
}
Run Code Online (Sandbox Code Playgroud)