我有作业分配,我应该删除char数组中的所有前导空格。如果数组的开头有空格,也应删除它。另外,我必须要关心一个空数组。我无法使用<cstring>
和<string.h>
。另外,我无法创建任何其他数组。我google了很多,但我不知道如何解决这个问题。这是我到目前为止所拥有的。
void clean(char* tab)
{
//char *p = tab;
for (int i = 0; i <= sizeof(tab); i++)
{
if ((tab[i] = ' ') && (tab[i + 1] = ' '))
{
tab[i] = tab[i + 1];
}
}
}
int main()
{
char tab1[] = " h qa w e ";
cout << tab1 << endl;
clean(tab1);
cout << tab1 << endl;
}
如果有人能给我一个如何弄明白的提示,我将非常感激。
答案 0 :(得分:0)
将每个空格视为数组中的“自由空间”,您应填写一个空格。
您可以在char数组中维护两个指向不同位置的指针。一个到第一个可用空间,另一个到你检查的当前角色。
你只需要弄清楚这些问题:
答案 1 :(得分:0)
这里有一些不同的问题。
其中一个是您错误输入了比较:if ((tab[i] = ' ') && (tab[i+1] = ' '))
无疑应该是:if ((tab[i] == ' ') && (tab[i+1] == ' '))
。
其次,你正在使用sizeof(a pointer)
,你真正想要strlen(a pointer)
(或者至少有类似的东西,扫描一个表示字符串结尾的NUL字符)。
第三,你的循环实现的算法似乎并没有反映出很好地删除前导空格的意图(如果有的话)。我会扫描第一个不是空格的东西,然后复制字符串的其余部分,使其从字符串的开头开始。
[抱歉,但我不会发布实际代码或更多详细信息而不是家庭作业。]
答案 2 :(得分:0)
这些代码完全不依赖于nor,并且它们不分配任何临时缓冲区。请注意,必须定义自制#include <iostream>
void copy( char* to, char* from )
{
int i = 0;
while ( true ) // risky in case char* has no EOS character!
{
to[i] = from[i];
if ( from[i] != '\0' )
++i;
else
break;
}
}
void clean( char* tab )
{
int i = 0;
while ( tab[i] != '\0' )
{
if ( tab[i] == ' ')
{
copy( tab + i, tab + i + 1 );
// do not increment i, to test tab[i] that was newly copied from tab[i+1]
}
else
{
++i;
}
}
}
int main() {
char tab1[] = " h qa w e ";
std::cout << tab1 << std::endl;
clean(tab1);
std::cout << tab1 << std::endl;
}
函数,以便在删除空格时复制字符串内容。
请注意,此代码易于理解,但可能/应该进行优化,以便在需要性能时尽量减少副本。
由于目前还不清楚你到底想要什么......
这个删除字符串中的所有空格。
clean
如果您只想删除前导空格,则更容易,只需更改void clean( char* tab )
{
int i = 0;
while ( tab[i] == ' ' )
{
copy( tab + i, tab + i + 1 );
}
}
功能:
{{1}}