我有一个程序,我想从字符串中删除空格.我想找到一个优雅的方式来做到这一点,所以我发现下面的(我已经改变了它一点,所以它可能是更好的可读性)代码在一个论坛:
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)
其他人已经回答了你的问题,但这是相同代码的更快,也许更清晰的版本:
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)