你好,伙计们, 我在c中编写String trim方法,这是我想出的代码。我认为它可以消除前导和尾随空格,但我希望代码可以更清晰。你能建议改进吗?可能重复:
Painless way to trim leading/trailing whitespace in C?
Trim a string in C
void trim(char *String)
{
int i=0;j=0;
char c,lastc;
while(String[i])
{
c=String[i];
if(c!=' ')
{
String[j]=c;
j++;
}
else if(lastc!= ' ')
{
String[j]=c;
j++;
}
lastc = c;
i++;
}
这段代码看起来干净吗?
答案 0 :(得分:4)
它看起来不干净。假设第一个字符是空格,则表示您使用的lastc
具有未定义的值。你最后会留下一个空格(如果末尾有一个空格,当它被点击时c
将是一个空格,而lastc
则不会。)
你也没有终止字符串。假设您修复了未初始化的lastc
问题,您将“abc”转换为“abcbc”,因为它不会在任何时候缩短。
代码还会折叠字符串中的多个空格。这不是你所描述的;这是理想的行为吗?
答案 1 :(得分:3)
如果您明智地使用标准库函数,它通常会使您的代码更具可读性 - 例如,isspace()
和memmove()
在这里特别有用:
#include <string.h>
#include <ctype.h>
void trim(char *str)
{
char *start, *end;
/* Find first non-whitespace */
for (start = str; *start; start++)
{
if (!isspace((unsigned char)start[0]))
break;
}
/* Find start of last all-whitespace */
for (end = start + strlen(start); end > start + 1; end--)
{
if (!isspace((unsigned char)end[-1]))
break;
}
*end = 0; /* Truncate last whitespace */
/* Shift from "start" to the beginning of the string */
if (start > str)
memmove(str, start, (end - start) + 1);
}
答案 2 :(得分:1)
该代码存在一些问题。它只检查空间。不是制表符或换行符。您正在复制字符串的整个非空白部分。并且在设置之前使用lastc。
这是备用版本(已编译但未经过测试):
char *trim(char *string)
{
char *start;
int len = strlen(string);
int i;
/* Find the first non whitespace char */
for (i = 0; i < len; i++) {
if (! isspace(string[i])) {
break;
}
}
if (i == len) {
/* string is all whitespace */
return NULL;
}
start = &string[i];
/* Remove trailing white space */
for (i = len; i > 0; i--) {
if (isspace(string[i])) {
string[i] = '\0';
} else {
break;
}
}
return start;
}
答案 3 :(得分:1)
存在一些问题:lastc
可以未经初始化使用。例如,您可以使用for循环而不是while循环。此外,trim / strip函数通常会替换空格,制表符和换行符。
这是一个使用我之前写过的指针的解决方案:
void trim(char *str)
{
char *ptr = str;
while(*ptr == ' ' || *ptr == '\t' || *ptr == '\r' || *ptr == '\n') ++ptr;
char *end = ptr;
while(*end) ++end;
if(end > ptr)
{
for(--end; end >= ptr && (*end == ' ' || *end == '\t' || *end == '\r' || *end == '\n'); --end);
}
memmove(str, ptr, end-ptr);
str[end-ptr] = 0;
}
答案 4 :(得分:1)
这是我的解决方案。
简短,简洁,干净,评论和轻度测试。
它使用“isspace”分类功能,因此您可以轻松更改要修剪的“空白区域”的定义。
void trim(char* String)
{
int dest;
int src=0;
int len = strlen(String);
// Advance src to the first non-whitespace character.
while(isspace(String[src])) src++;
// Copy the string to the "front" of the buffer
for(dest=0; src<len; dest++, src++)
{
String[dest] = String[src];
}
// Working backwards, set all trailing spaces to NULL.
for(dest=len-1; isspace(String[dest]); --dest)
{
String[dest] = '\0';
}
}
答案 5 :(得分:0)
我没有将字符与空格字符''进行比较,而是使用“isspace”函数,我相信它是在ctype.h中定义的。
答案 6 :(得分:0)
我不知道干净,但我发现很难遵循。如果我需要这样做,我最初会分两个阶段来考虑它:
然后我可能会更仔细地查看您似乎试图实施的一次性解决方案,但前提是存在速度问题。
顺便说一下,您可能希望使用isspace()
而不是仅检查空间。