此代码从字符串中删除空格。
char *RemoveSpaces(char *source)
{
char* i = source;
char* j = source;
while(*j != '\0')
{
*i = *j++;
if(*i != ' ')
i++;
}
*i = 0;
return i;
}
但是当我使用printf
时,它什么也不会返回。
printf("%s", RemoveSpaces("HELLO WORLD!!! COME ONE\r"));
答案 0 :(得分:2)
*i = 0;
return i; // wrong pointer returned
是错误的。它返回一个指向字符串终止的指针(即指向0的指针)。因此它什么也不打印。
尝试:
*i = 0; // or *i = '\0';
return source; // correct pointer returned
此外,不允许修改字符串文字。而是:
char str[] = "HELLO WORLD!!! COME ONE\r";
printf("%s", RemoveSpaces(str));
答案 1 :(得分:1)
稍微调整一下空间删除逻辑可能会使事情更有意义。而不是设置
*i = *j++;
if(*i != ' ')
i++;
在测试是否*i != ' '
之前,您可能会发现先测试然后再赋值(其中p
是您的i
和ep
(结束指针)更有意义是您的j
),例如
while (*ep) { /* iterate ep from beginning to end of src */
if (*ep != ' ') /* if its not a space */
*p++ = *ep; /* set begin pointer to char at end ptr, advance */
ep++; /* advance to next char */
}
*p = 0; /* nul-terminate src at p */
从这种意义上说,仅当当前字符不是空格时,才分配和前进初始指针。
在您的示例和此处,您将就地修改source
的内容,您的'i'
和'j'
指针用于遍历source
中的字符,因此,当您完成迭代后,return source
(或在就地修改source
的内容时,可以在调用者中使用源而无需返回。
将这些部分放在一起,您可以执行类似以下的操作,该操作将使用字符串从中删除空格作为代码的第一个参数(如果没有给出参数,则默认使用"HELLO WORLD!!! COME ONE\n"
),例如
#include <stdio.h>
char *rmspaces (char *src)
{
char *p = src, /* pointer to beginning of src */
*ep = src; /* pointer to iterate to the end of src */
while (*ep) { /* iterate ep from beginning to end of src */
if (*ep != ' ') /* if its not a space */
*p++ = *ep; /* set begin pointer to char at end ptr, advance */
ep++; /* advance to next char */
}
*p = 0; /* nul-terminate src at p */
return src;
}
int main (int argc, char **argv) {
char *s = argc > 1 ? argv[1] : (char[]){"HELLO WORLD!!! COME ONE\n"};
printf ("%s", rmspaces (s));
return 0;
}
(注意:),您的就地编辑很好,但是在我看来,source
(或src
)必须是可修改的,这意味着您不能通过 string-literal 为source
(可能会出现SegFault)。在默认情况下,在 compound-literal 上方用于确保测试过去是可修改的字符数组。
使用/输出示例
$ ./bin/rmspaces
HELLOWORLD!!!COMEONE
仔细检查一下,如果还有其他问题,请告诉我。