从C中删除字符串中的空格?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从C中删除字符串中的空格?相关的知识,希望对你有一定的参考价值。
在C中从字符串中删除空格的最简单,最有效的方法是什么?
最简单,最有效率通常不会一起......
这是一个可能的解决方案(未经测试):
void RemoveSpaces(char* source)
{
char* i = source;
char* j = source;
while(*j != 0)
{
*i = *j++;
if(*i != ' ')
i++;
}
*i = 0;
}
这是我能想到的最简单的(测试),它的确有效!
char message[50];
fgets(message, 50, stdin);
for( i = 0, j = 0; i < strlen(message); i++){
message[i-j] = message[i];
if(message[i] == ' ')
j++;
}
message[i] = ' ';
高效且非常简单的解决方案:
//Removespaces.
void be_gone_spaces(char *str)
{
char *p = str;
do *(*p == ' ' ? str : str++) = *p;
while (*p++);
}
代码取自zString库
/* search for character 's' */
int zstring_search_chr(char *token,char s){
if (!token || s==' ')
return 0;
for (;*token; token++)
if (*token == s)
return 1;
return 0;
}
char *zstring_remove_chr(char *str,const char *bad) {
char *src = str , *dst = str;
/* validate input */
if (!(str && bad))
return NULL;
while(*src)
if(zstring_search_chr(bad,*src))
src++;
else
*dst++ = *src++; /* assign first, then incement */
*dst=' ';
return str;
}
代码示例
Exmaple Usage
char s[]="this is a trial string to test the function.";
char *d=" .";
printf("%s
",zstring_remove_chr(s,d));
Example Output
thisisatrialstringtotestthefunction
在zString代码上有一个llok,你可能会发现它有用https://github.com/fnoyanisi/zString
我遇到了这个问题的变体,你需要将空间乘以一个空间“代表”空间。
这是我的解决方案:
char str[] = "Put Your string Here.....";
int copyFrom = 0, copyTo = 0;
printf("Start String %s
", str);
while (str[copyTo] != 0) {
if (str[copyFrom] == ' ') {
str[copyTo] = str[copyFrom];
copyFrom++;
copyTo++;
while ((str[copyFrom] == ' ') && (str[copyFrom] !=' ')) {
copyFrom++;
}
}
str[copyTo] = str[copyFrom];
if (str[copyTo] != ' ') {
copyFrom++;
copyTo++;
}
}
printf("Final String %s
", str);
希望能帮助到你 :-)
这是一个非常紧凑但完全正确的版本:
do while(isspace(*s)) s++; while(*d++ = *s++);
在这里,仅仅为了我的娱乐,代码高尔夫版本并不完全正确,并让评论者感到不安。
如果你可以冒一些未定义的行为,并且永远不会有空字符串,你可以摆脱身体:
while(*(d+=!isspace(*s++)) = *s);
哎呀,如果按空间你的意思只是空间特征:
while(*(d+=*s++!=' ')=*s);
不要在生产中使用它:)
正如我们从发布的答案中看到的那样,这绝对不是一项微不足道的任务。当面对这样的任务时,似乎许多程序员选择将常识抛到窗外,以便产生他们可能想出的最隐蔽的片段。
需要考虑的事项:
- 您将需要复制字符串,并删除空格。修改传递的字符串是不好的做法,它可能是一个字符串文字。此外,有时将字符串视为immutable objects也有好处。
- 您不能假设源字符串不为空。它可能只包含一个空终止字符。
- 调用函数时,目标缓冲区可以包含任何未初始化的垃圾。检查它是否为空终止没有任何意义。
- 源代码文档应说明目标缓冲区需要足够大以包含修剪后的字符串。最简单的方法是使其与未修剪的字符串一样大。
- 当函数完成时,目标缓冲区需要保持一个空终止字符串,不带空格。
- 考虑是否要删除所有空白字符或仅删除空格
' '
。 - C编程并不是一场竞争,因为谁可以尽可能多地挤压一条线路上的运营商。相反,一个好的C程序包含可读代码(总是最重要的质量),而不会牺牲程序效率(有点重要)。
- 因此,通过让它成为复制代码的一部分,您无法获得隐藏目标字符串的空终止插入的奖励积分。相反,将null终止插入显式化,以表明您不是偶然设法使其正确。
我会怎么做:
void remove_spaces (char* restrict str_trimmed, const char* restrict str_untrimmed)
{
while (*str_untrimmed != ' ')
{
if(!isspace(*str_untrimmed))
{
*str_trimmed = *str_untrimmed;
str_trimmed++;
}
str_untrimmed++;
}
*str_trimmed = ' ';
}
在此代码中,源字符串“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
", str);
其他字符串是只读的,例如在代码中声明的字符串。您必须将这些内容复制到新分配的内存区域,并通过跳过空格来填充副本:
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
", newstr);
你可以看到为什么人们发明了其他语言;)
#include <ctype>
char * remove_spaces(char * source, char * target)
{
while(*source++ && *target)
{
if (!isspace(*source))
*target++ = *source;
}
return target;
}
笔记;
- 这不处理Unicode。
如果你仍然感兴趣,这个函数从字符串的开头删除空格,我只是在我的代码中使用它:
void removeSpaces(char *str1)
{
char *str2;
str2=str1;
while (*str2==' ') str2++;
if (str2!=str1) memmove(str1,str2,strlen(str2)+1);
}
从字符串中删除空格的最简单,最有效的方法是简单地从字符串文字中删除空格。例如,使用你的编辑器用"hello world"
'找到并替换'"helloworld"
,然后presto!
好的,我知道那不是你的意思。并非所有字符串都来自字符串文字,对吧?假设这个字符串你想要删除的空格不是来自字符串文字,我们需要考虑你的字符串的来源和目的地...我们需要考虑你的整个算法,你试图解决的实际问题,以建议最简单和最优的方法。
也许你的字符串来自一个文件(例如stdin
),并且必然会被写入另一个文件(例如stdout
)。如果是这种情况,我会质疑为什么它首先需要成为一个字符串。只是把它看作是一个人物流,当你遇到它们时丢弃空间......
#include <stdio.h>
int main(void) {
for (;;) {
int c = getchar();
if (c == EOF) { break; }
if (c == ' ') { continue; }
putchar(c);
}
}
通过消除对字符串存储的需要,不仅整个程序变得更短,更短,而且理论上也更有效。
#include<stdio.h>
#include<string.h>
main()
{
int i=0,n;
int j=0;
char str[]=" Nar ayan singh ";
char *ptr,*ptr1;
printf("sizeof str:%ld
",strlen(str));
while(str[i]==' ')
{
memcpy (str,str+1,strlen(str)+1);
}
printf("sizeof str:%ld
",strlen(str));
n=strlen(str);
while(str[n]==' ' || str[n]==' ')
n--;
str[n+1]=' ';
printf("str:%s ",str);
printf("sizeof str:%ld
",strlen(str));
}
我假设C字符串在固定内存中,所以如果你替换空格,你必须移动所有字符。
最简单的似乎是创建新字符串并迭代原始字符串并仅复制非空格字符。
以上是关于从C中删除字符串中的空格?的主要内容,如果未能解决你的问题,请参考以下文章