如何以标准的方式修剪前导/尾随空格?

如何以标准的方式修剪前导/尾随空格?

是否有一种干净的、最好是标准的方法来从C中的字符串中修整前导和尾随空格?我会自己动手,但我会认为这是一个同样通用的解决方案的共同问题。



心有法竹
浏览 436回答 3
3回答

qq_花开花谢_0

如果可以修改字符串://&nbsp;Note:&nbsp;This&nbsp;function&nbsp;returns&nbsp;a&nbsp;pointer&nbsp;to&nbsp;a&nbsp;substring&nbsp;of&nbsp;the&nbsp;original&nbsp;string. //&nbsp;If&nbsp;the&nbsp;given&nbsp;string&nbsp;was&nbsp;allocated&nbsp;dynamically,&nbsp;the&nbsp;caller&nbsp;must&nbsp;not&nbsp;overwrite //&nbsp;that&nbsp;pointer&nbsp;with&nbsp;the&nbsp;returned&nbsp;value,&nbsp;since&nbsp;the&nbsp;original&nbsp;pointer&nbsp;must&nbsp;be //&nbsp;deallocated&nbsp;using&nbsp;the&nbsp;same&nbsp;allocator&nbsp;with&nbsp;which&nbsp;it&nbsp;was&nbsp;allocated.&nbsp;&nbsp;The&nbsp;return //&nbsp;value&nbsp;must&nbsp;NOT&nbsp;be&nbsp;deallocated&nbsp;using&nbsp;free()&nbsp;etc.char&nbsp;*trimwhitespace(char&nbsp;*str){ &nbsp;&nbsp;char&nbsp;*end; &nbsp;&nbsp;//&nbsp;Trim&nbsp;leading&nbsp;space &nbsp;&nbsp;while(isspace((unsigned&nbsp;char)*str))&nbsp;str++; &nbsp;&nbsp;if(*str&nbsp;==&nbsp;0)&nbsp;&nbsp;//&nbsp;All&nbsp;spaces? &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;str; &nbsp;&nbsp;//&nbsp;Trim&nbsp;trailing&nbsp;space &nbsp;&nbsp;end&nbsp;=&nbsp;str&nbsp;+&nbsp;strlen(str)&nbsp;-&nbsp;1; &nbsp;&nbsp;while(end&nbsp;>&nbsp;str&nbsp;&&&nbsp;isspace((unsigned&nbsp;char)*end))&nbsp;end--; &nbsp;&nbsp;//&nbsp;Write&nbsp;new&nbsp;null&nbsp;terminator&nbsp;character &nbsp;&nbsp;end[1]&nbsp;=&nbsp;'\0'; &nbsp;&nbsp;return&nbsp;str;}如果不能修改字符串,则可以使用基本相同的方法://&nbsp;Stores&nbsp;the&nbsp;trimmed&nbsp;input&nbsp;string&nbsp;into&nbsp;the&nbsp;given&nbsp;output&nbsp;buffer,&nbsp;which&nbsp;must&nbsp;be//&nbsp;large&nbsp;enough&nbsp;to&nbsp;store&nbsp;the&nbsp;result.&nbsp;&nbsp; If&nbsp;it&nbsp;is&nbsp;too&nbsp;small,&nbsp;the&nbsp;output&nbsp;is//&nbsp;truncated.size_t&nbsp;trimwhitespace(char&nbsp;*out,&nbsp;size_t&nbsp;len,&nbsp;const&nbsp;char&nbsp;*str){ &nbsp;&nbsp;if(len&nbsp;==&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; &nbsp;&nbsp;const&nbsp;char&nbsp;*end; &nbsp;&nbsp;size_t&nbsp;out_size; &nbsp;&nbsp;//&nbsp;Trim&nbsp;leading&nbsp;space &nbsp;&nbsp;while(isspace((unsigned&nbsp;char)*str))&nbsp;str++; &nbsp;&nbsp;if(*str&nbsp;==&nbsp;0)&nbsp;&nbsp;//&nbsp;All&nbsp;spaces? &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;*out&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1; &nbsp;&nbsp;} &nbsp;&nbsp;//&nbsp;Trim&nbsp;trailing&nbsp;space &nbsp;&nbsp;end&nbsp;=&nbsp;str&nbsp;+&nbsp;strlen(str)&nbsp;-&nbsp;1; &nbsp;&nbsp;while(end&nbsp;>&nbsp;str&nbsp;&&&nbsp;isspace((unsigned&nbsp;char)*end))&nbsp;end--; &nbsp;&nbsp;end++; &nbsp;&nbsp;//&nbsp;Set&nbsp;output&nbsp;size&nbsp;to&nbsp;minimum&nbsp;of&nbsp;trimmed&nbsp;string&nbsp;length&nbsp;and&nbsp;buffer&nbsp;size&nbsp;minus&nbsp;1 &nbsp;&nbsp;out_size&nbsp;=&nbsp;(end&nbsp;-&nbsp;str)&nbsp;<&nbsp;len-1&nbsp;?&nbsp;(end&nbsp;-&nbsp;str)&nbsp;:&nbsp;len-1; &nbsp;&nbsp;//&nbsp;Copy&nbsp;trimmed&nbsp;string&nbsp;and&nbsp;add&nbsp;null&nbsp;terminator &nbsp;&nbsp;memcpy(out,&nbsp;str,&nbsp;out_size); &nbsp;&nbsp;out[out_size]&nbsp;=&nbsp;0; &nbsp;&nbsp;return&nbsp;out_size;}

海绵宝宝撒

这里有一个将字符串转换到缓冲区的第一个位置的方法。您可能需要这种行为,以便如果动态分配字符串,仍然可以在TRIM()返回的指针上释放它:char&nbsp;*trim(char&nbsp;*str){ &nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;len&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*frontp&nbsp;=&nbsp;str; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*endp&nbsp;=&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;str&nbsp;==&nbsp;NULL&nbsp;)&nbsp;{&nbsp;return&nbsp;NULL;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;str[0]&nbsp;==&nbsp;'\0'&nbsp;)&nbsp;{&nbsp;return&nbsp;str;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;strlen(str); &nbsp;&nbsp;&nbsp;&nbsp;endp&nbsp;=&nbsp;str&nbsp;+&nbsp;len; &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Move&nbsp;the&nbsp;front&nbsp;and&nbsp;back&nbsp;pointers&nbsp;to&nbsp;address&nbsp;the&nbsp;first&nbsp;non-whitespace &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;characters&nbsp;from&nbsp;each&nbsp;end. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;isspace((unsigned&nbsp;char)&nbsp;*frontp)&nbsp;)&nbsp;{&nbsp;++frontp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;endp&nbsp;!=&nbsp;frontp&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;isspace((unsigned&nbsp;char)&nbsp;*(--endp))&nbsp;&&&nbsp;endp&nbsp;!=&nbsp;frontp&nbsp;)&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;str&nbsp;+&nbsp;len&nbsp;-&nbsp;1&nbsp;!=&nbsp;endp&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(endp&nbsp;+&nbsp;1)&nbsp;=&nbsp;'\0'; &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(&nbsp;frontp&nbsp;!=&nbsp;str&nbsp;&&&nbsp;&nbsp;endp&nbsp;==&nbsp;frontp&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*str&nbsp;=&nbsp;'\0'; &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Shift&nbsp;the&nbsp;string&nbsp;so&nbsp;that&nbsp;it&nbsp;starts&nbsp;at&nbsp;str&nbsp;so&nbsp;that&nbsp;if&nbsp;it's&nbsp;dynamically &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;allocated,&nbsp;we&nbsp;can&nbsp;still&nbsp;free&nbsp;it&nbsp;on&nbsp;the&nbsp;returned&nbsp;pointer.&nbsp;&nbsp;Note&nbsp;the&nbsp;reuse &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;of&nbsp;endp&nbsp;to&nbsp;mean&nbsp;the&nbsp;front&nbsp;of&nbsp;the&nbsp;string&nbsp;buffer&nbsp;now. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;endp&nbsp;=&nbsp;str; &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;frontp&nbsp;!=&nbsp;str&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;*frontp&nbsp;)&nbsp;{&nbsp;*endp++&nbsp;=&nbsp;*frontp++;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*endp&nbsp;=&nbsp;'\0'; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;str;}检验正确性:int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;*argv[]){ &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*sample_strings[]&nbsp;= &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"nothing&nbsp;to&nbsp;trim", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;trim&nbsp;the&nbsp;front", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"trim&nbsp;the&nbsp;back&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;trim&nbsp;one&nbsp;char&nbsp;front&nbsp;and&nbsp;back&nbsp;", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;trim&nbsp;one&nbsp;char&nbsp;front", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"trim&nbsp;one&nbsp;char&nbsp;back&nbsp;", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"a", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;test_buffer[64]; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;index; &nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;index&nbsp;=&nbsp;0;&nbsp;sample_strings[index]&nbsp;!=&nbsp;NULL;&nbsp;++index&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(&nbsp;test_buffer,&nbsp;sample_strings[index]&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("[%s]&nbsp;->&nbsp;[%s]\n",&nbsp;sample_strings[index], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trim(test_buffer)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;The&nbsp;test&nbsp;prints&nbsp;the&nbsp;following: &nbsp;&nbsp;&nbsp;&nbsp;[nothing&nbsp;to&nbsp;trim]&nbsp;->&nbsp;[nothing&nbsp;to&nbsp;trim] &nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;trim&nbsp;the&nbsp;front]&nbsp;->&nbsp;[trim&nbsp;the&nbsp;front] &nbsp;&nbsp;&nbsp;&nbsp;[trim&nbsp;the&nbsp;back&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp;->&nbsp;[trim&nbsp;the&nbsp;back] &nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;trim&nbsp;one&nbsp;char&nbsp;front&nbsp;and&nbsp;back&nbsp;]&nbsp;->&nbsp;[trim&nbsp;one&nbsp;char&nbsp;front&nbsp;and&nbsp;back] &nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;trim&nbsp;one&nbsp;char&nbsp;front]&nbsp;->&nbsp;[trim&nbsp;one&nbsp;char&nbsp;front] &nbsp;&nbsp;&nbsp;&nbsp;[trim&nbsp;one&nbsp;char&nbsp;back&nbsp;]&nbsp;->&nbsp;[trim&nbsp;one&nbsp;char&nbsp;back] &nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp;->&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;]&nbsp;->&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;[a]&nbsp;->&nbsp;[a] &nbsp;&nbsp;&nbsp;&nbsp;[]&nbsp;->&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}源文件是trim.c。用“cc trim.c-o TRIM”编译。

慕码人8056858

我的解决方案。字符串必须是可变的。相对于其他一些解决方案的优点,它将非空格部分移至开头,这样您就可以继续使用旧指针,以防您以后不得不释放()它。void&nbsp;trim(char&nbsp;*&nbsp;s)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*&nbsp;p&nbsp;=&nbsp;s; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;l&nbsp;=&nbsp;strlen(p); &nbsp;&nbsp;&nbsp;&nbsp;while(isspace(p[l&nbsp;-&nbsp;1]))&nbsp;p[--l]&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;while(*&nbsp;p&nbsp;&&&nbsp;isspace(*&nbsp;p))&nbsp;++p,&nbsp;--l; &nbsp;&nbsp;&nbsp;&nbsp;memmove(s,&nbsp;p,&nbsp;l&nbsp;+&nbsp;1);}此版本创建字符串的副本,而不是在适当的位置进行编辑。strn心得()需要_GNU_source,所以您可能需要使用malloc()和strncpy()创建您自己的strn达普()。char&nbsp;*&nbsp;trim(char&nbsp;*&nbsp;s)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;l&nbsp;=&nbsp;strlen(s); &nbsp;&nbsp;&nbsp;&nbsp;while(isspace(s[l&nbsp;-&nbsp;1]))&nbsp;--l; &nbsp;&nbsp;&nbsp;&nbsp;while(*&nbsp;s&nbsp;&&&nbsp;isspace(*&nbsp;s))&nbsp;++s,&nbsp;--l; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;strndup(s,&nbsp;l);}
打开App,查看更多内容
随时随地看视频慕课网APP