1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > c语言如何删除空格字符 从C中的字符串中删除空格?

c语言如何删除空格字符 从C中的字符串中删除空格?

时间:2020-11-18 08:22:59

相关推荐

c语言如何删除空格字符 从C中的字符串中删除空格?

从C中的字符串中删除空格?

在C语言中从字符串中删除空格的最简单,最有效的方法是什么?

Tyler Treat asked -07-17T12:59:47Z

12个解决方案

76 votes

最简单,最有效的方法通常不合用...

这是一个可能的解决方案:

void remove_spaces(char* s) {

const char* d = s;

do {

while (*d == ' ') {

++d;

}

} while (*s++ = *d++);

}

Aaron answered -07-17T13:00:00Z

17 votes

这是一个非常紧凑但完全正确的版本:

do while(isspace(*s)) s++; while(*d++ = *s++);

在这里,仅出于我的娱乐目的,有些代码版本并不完全正确,并且会使注释者不高兴。

如果您可以冒一些不确定的行为的风险,并且永远不会有空字符串,那么您可以摆脱正文:

while(*(d+=!isspace(*s++)) = *s);

哎呀,如果用空格指的是空格字符:

while(*(d+=*s++!=' ')=*s);

不要在生产中使用它:)

Kornel answered -07-17T13:00:37Z

11 votes

从发布的答案中我们可以看到,这令人惊讶地不是一项琐碎的任务。 当面对这样的任务时,似乎许多程序员选择将常识抛诸脑后,以产生他们可能会想到的最晦涩的片段。

注意事项:

您将需要复制字符串,并删除空格。 修改传递的字符串是一种不好的做法,它可能是字符串文字。 同样,有时将字符串视为不可变对象也有好处。

您不能假定源字符串不为空。 它可能只包含一个空终止符。

调用函数时,目标缓冲区可以包含任何未初始化的垃圾。 检查它是否为空终止没有任何意义。

源代码文档应声明目标缓冲区必须足够大以包含修剪后的字符串。 这样做的最简单方法是使其与未修剪的字符串一样大。

函数完成后,目标缓冲区需要保留一个空的终止字符串,不带空格。

请考虑是否要删除所有空白字符或仅删除空格restrict。

对于谁可以在一条线上尽可能多地挤入更多运算符,C编程并不是一个竞争。 恰恰相反,一个好的C程序包含可读代码(总是最重要的质量)而又不牺牲程序效率(有些重要)。

因此,通过将目标字符串作为复制代码的一部分来隐藏目标字符串的空终止的插入,不会获得任何加分。 相反,应使空终止插入显式显示,以表明您并没有设法使它正确无误。

我会做什么:

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';

}

在此代码中,源字符串“ str_untrimmed”保持不变,这可以通过使用适当的const正确性来保证。 如果源字符串仅包含空终止符,则不会崩溃。 始终为null终止目标字符串。

内存分配留给调用方。 该算法应仅专注于完成其预期的工作。 它将删除所有空白。

代码中没有巧妙的技巧。 它不会尝试在一行中挤入尽可能多的运算符。 这将使IOCCC的候选人很差。 然而,它产生的机器代码几乎与更加晦涩的单线版本相同。

但是,在复制内容时,您可以通过将两个指针都声明为restrict(这是程序员和编译器之间的约定)来优化位,程序员在其中保证目标和源不是相同的地址(或更确切地说,它们所指向的数据 指向只能通过该指针访问,而不能通过其他指针访问)。 这样可以进行更有效的优化,因为编译器随后可以将其直接从源复制到目标,而无需在它们之间的临时内存。

Lundin answered -07-17T13:02:02Z

7 votes

在C语言中,您可以就地替换一些字符串,例如strdup()返回的字符串:

char *str = strdup(" a b c ");

char *write = str, *read = str;

do {

if (*read != ' ')

*write++ = *read;

} while (*read++);

printf("%s\n", 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\n", newstr);

您可以看到人们发明其他语言的原因;)

Andomar answered -07-17T13:02:30Z

2 votes

#include

char * remove_spaces(char * source, char * target)

{

while(*source++ && *target)

{

if (!isspace(*source))

*target++ = *source;

}

return target;

}

笔记;

这不处理Unicode。

quark answered -07-17T13:02:54Z

2 votes

如果您仍然感兴趣,则此函数从字符串的开头删除空格,而我刚刚在代码中使用了它:

void removeSpaces(char *str1)

{

char *str2;

str2=str1;

while (*str2==' ') str2++;

if (str2!=str1) memmove(str1,str2,strlen(str2)+1);

}

Alfredo answered -07-17T13:03:14Z

2 votes

从字符串中删除空格的最简单,最有效的方法是简单地从字符串文字中删除空格。 例如,使用编辑器将stdin查找并替换为stdout,然后保存!

好吧,我知道那不是你的意思。 不是所有的字符串都来自字符串文字,对不对? 假设您要从中删除空格的字符串不是来自字符串文字,我们需要考虑字符串的源和目的地...我们需要考虑整个算法,您要解决的实际问题是 为了建议最简单,最优化的方法。

也许您的字符串来自一个文件(例如stdin),并且必然要写入另一个文件(例如stdout)。 如果是这样,我会质疑为什么它首先需要成为一个字符串。 就像对待字符流一样对待它,当遇到它们时就丢弃空格...

#include

int main(void) {

for (;;) {

int c = getchar();

if (c == EOF) { break; }

if (c == ' ') { continue; }

putchar(c);

}

}

通过消除存储字符串的需求,整个程序不仅变得越来越短,而且在理论上也变得更加高效。

autistic answered -07-17T13:03:50Z

1 votes

#include

#include

main()

{

int i=0,n;

int j=0;

char str[]=" Nar ayan singh ";

char *ptr,*ptr1;

printf("sizeof str:%ld\n",strlen(str));

while(str[i]==' ')

{

memcpy (str,str+1,strlen(str)+1);

}

printf("sizeof str:%ld\n",strlen(str));

n=strlen(str);

while(str[n]==' ' || str[n]=='\0')

n--;

str[n+1]='\0';

printf("str:%s ",str);

printf("sizeof str:%ld\n",strlen(str));

}

Narayan Singh answered -07-17T13:04:05Z

0 votes

我假设C字符串在固定的内存中,所以如果替换空格,则必须移动所有字符。

最简单的方法似乎是创建新字符串,然后遍历原始字符串,然后仅复制非空格字符。

stefanB answered -07-17T13:04:30Z

0 votes

那是我想到的(TESTED)最简单的方法,并且有效!!

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] = '\0';

nAiN answered -07-17T13:04:50Z

-1 votes

从zString库获取的代码

/* search for character 's' */

int zstring_search_chr(char *token,char s){

if (!token || s=='\0')

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='\0';

return str;

}

代码示例

Exmaple Usage

char s[]="this is a trial string to test the function.";

char *d=" .";

printf("%s\n",zstring_remove_chr(s,d));

Example Output

thisisatrialstringtotestthefunction

看一下String代码,您可能会发现它很有用[/fnoyanisi/zString]

fnisi answered -07-17T13:05:19Z

-1 votes

我遇到了这个问题的一种变体,您需要将乘法空间减少为一个空间,以“代表”这些空间。

这是我的解决方案:

char str[] = "Put Your string Here.....";

int copyFrom = 0, copyTo = 0;

printf("Start String %s\n", str);

while (str[copyTo] != 0) {

if (str[copyFrom] == ' ') {

str[copyTo] = str[copyFrom];

copyFrom++;

copyTo++;

while ((str[copyFrom] == ' ') && (str[copyFrom] !='\0')) {

copyFrom++;

}

}

str[copyTo] = str[copyFrom];

if (str[copyTo] != '\0') {

copyFrom++;

copyTo++;

}

}

printf("Final String %s\n", str);

希望能帮助到你 :-)

eyaler answered -07-17T13:05:47Z

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。