Aar*_*ron 76
最简单,最有效率通常不会一起......
这是一个可能的解决方案(未经测试):
void remove_spaces(char* s) {
const char* d = s;
do {
while (*d == ' ') {
++d;
}
} while (*s++ = *d++);
}
Run Code Online (Sandbox Code Playgroud)
Kor*_*nel 18
这是一个非常紧凑但完全正确的版本:
do while(isspace(*s)) s++; while(*d++ = *s++);
Run Code Online (Sandbox Code Playgroud)
在这里,仅仅为了我的娱乐,代码高尔夫版本并不完全正确,并让评论者感到不安.
如果你可以冒一些未定义的行为,并且永远不会有空字符串,你可以摆脱身体:
while(*(d+=!isspace(*s++)) = *s);
Run Code Online (Sandbox Code Playgroud)
哎呀,如果按空间你的意思只是空间特征:
while(*(d+=*s++!=' ')=*s);
Run Code Online (Sandbox Code Playgroud)
不要在生产中使用它:)
Lun*_*din 11
正如我们从发布的答案中看到的那样,这绝对不是一项微不足道的任务.当面对这样的任务时,似乎许多程序员选择将常识抛到窗外,以便产生他们可能想出的最隐蔽的片段.
需要考虑的事项:
' '.我会怎么做:
void remove_spaces (char* restrict str_trimmed, const char* restrict str_untrimmed)
{
while (*str_untrimmed != '\0')
{
if(!isspace(*str_untrimmed))
{
*str_trimmed = *str_untrimmed;
str_trimmed++;
}
str_untrimmed++;
}
*str_trimmed = '\0';
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,源字符串"str_untrimmed"保持不变,这通过使用适当的const正确性得到保证.如果源字符串只包含空终止,则不会崩溃.它始终为null终止目标字符串.
内存分配留给调用者.算法应该只专注于完成预期的工作.它删除所有空格.
代码中没有任何细微的技巧.它不会尝试在一条线上挤入尽可能多的运算符.它将成为IOCCC的一个非常差的候选人.然而,它将产生与更加模糊的单线版本相同的机器代码.
在复制某些东西时,你可以通过将两个指针都声明为restrict程序员和编译器之间的契约来优化一点,程序员保证目标和源不是同一个地址(或者更确切地说,他们指向的数据)只能通过那个指针而不是通过其他指针访问.这允许更有效的优化,因为编译器然后可以直接从源复制到目的地,而在它们之间没有临时存储器.
在C中,您可以就地替换一些字符串,例如strdup()返回的字符串:
char *str = strdup(" a b c ");
char *write = str, *read = str;
do {
if (*read != ' ')
*write++ = *read;
} while (*read++);
printf("%s\n", str);
Run Code Online (Sandbox Code Playgroud)
其他字符串是只读的,例如在代码中声明的字符串.您必须将这些内容复制到新分配的内存区域,并通过跳过空格来填充副本:
char *oldstr = " a b c ";
char *newstr = malloc(strlen(oldstr)+1);
char *np = newstr, *op = oldstr;
do {
if (*op != ' ')
*np++ = *op;
} while (*op++);
printf("%s\n", newstr);
Run Code Online (Sandbox Code Playgroud)
你可以看到为什么人们发明了其他语言;)
| 归档时间: |
|
| 查看次数: |
127209 次 |
| 最近记录: |