我需要从C中的动态字符数组中删除前导空格。我的应用程序几乎可以工作,但它在开头只留下一个空格。如何摆脱给定文本中的所有前导空格?我不应该使用string.h
中的函数。继承我的代码:
#include <stdio.h>
#include <stdlib.h>
int mystrlen(char *tab)
{
int i = 0;
while(tab[i] != '\0')
{
i++;
}
return i;
}
char* ex6(char *tab)
{
int spaces = 0, i, j = 0, s = 0;
for(i=0; tab[i] != '\0'; i++)
{
if (tab[i] == ' ')
spaces ++;
else
break;
}
spaces -= 1;
char *w = (char*) malloc (sizeof(char) * (mystrlen(tab) - spaces + 1));
for(i=0; tab[i] != '\0'; i++)
{
if (tab[i] == ' ')
{
++ s;
}
if(s > spaces)
{
w[j] = tab[i];
j ++;
}
}
w[j] = 0;
return w;
}
int main()
{
char txt[] = " Hello World";
char *w = ex6(txt);
printf("%s\n", w);
free(w);
w = NULL;
return 0;
}
答案 0 :(得分:3)
就地修改字符串允许以相当紧凑的方式去除前导空格,因为您不需要计算结果字符串的长度:
/* No includes needed for ltrim. */
void ltrim( char *s )
{
const char *t = s;
while ( *t && *t == ' ' )
++t;
while ( ( *s++ = *t++ ) )
;
}
#include <stdio.h>
int main()
{
char txt[] = " Hello World";
ltrim(txt);
printf("%s\n", txt);
return 0;
}
答案 1 :(得分:2)
问题出在spaces -= 1
行。你回去1个空间。
答案 2 :(得分:1)
您可以使用指针算法向前移动tab
指针,然后计算字符串中的剩余字符,然后为新字符串分配空间并将每个字符复制到新分配的空间。
这是没有strings.h
char* ex6(char *tab)
{
int i;
char *w;
while ((*tab == ' ') && (*tab != '\0'))
tab++;
w = malloc(mystrlen(tab) + 1);
i = 0;
while (*tab != '\0')
w[i++] = *tab++;
w[i] = '\0';
return w;
}