我有一个程序,想要从字符串中去除空格。我希望找到一种优雅的方法来实现,于是我找到了以下代码(我稍微修改了一下,以便更易读)在论坛上:
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;
}
如您所见,该函数接受一个字符串,并使用相同的分配内存空间,仅选择非空格字符。它有效!
无论如何,根据维基百科,在C中,字符串是“Null-terminated string”。我一直这样认为,一切都很好。但问题是:我们没有在
non_spaced
字符串的末尾放置“null-character”。而某种方式编译器知道它在由“non_spaced”字符串更改的最后一个字符结束。它是如何知道的?
strlen(line)
每次都会重新计算字符串的长度。这是一个非常复杂的计算,不应该在每个循环迭代中执行。你最好只需计算一次并将其存储:size_t len = strlen(line); for (i = 0; i <= len; i++)
。(此外,你所有声明为int
的变量在技术上都应该是size_t
类型。) - Chris Lutz