昨天美团模拟笔试,最后一个编程题:输入一个字符串,删去多余空格
如输入:" I love China ! "输出:"I love China !"
题目给了一个函数框架:
char* getString(char * sourceString)
{//待填充}
按理说这题并不难,个人感觉重点就在于返回值怎么确定。
1)如果队员指针进行处理,直接返回当然是没有问题的咯。
只是在删除空格之后的操作相对复杂一点。
2)在函数内部声明一个新指针,然后返回。
那么问题就出来了:
char a[10]; 完成操作后最后 return a;
获取可以得到正确结果,那是因为指针指向的内存暂时没有其他用处。
函数体中声明的为局部变量,在函数运行后会被自动撤回,这种方法是错误的。
char *a = (char*)malloc(size_t); 操作之后在return a;
切记这里a最终是要释放的,我们可以在调用该函数的函数体中free/delete。
鄙人写了一段代码,欢迎吐槽及纠错:
#include <iostream>
using namespace std;
char *getString(char * sourceString)
{
if(NULL == sourceString)
{
return NULL;
}
int length = strlen(sourceString);
// length = sizeof(sourceString); 这里得到的长度是4,是指针的长度
char *a = (char *)malloc(sizeof(char)*length);
int flag = 1; //避免第一个出现空格的情况
int count = 0;
while(length > 0)
{
if(' ' == *sourceString)
{
if(0 == flag)
{
*(a + count) = *sourceString;
count++;
}
flag = 1;
}
else
{
*(a + count) = *sourceString;
count++;
flag = 0;
}
sourceString++;
length--;
}
//处理最后一个空格,并在结尾加上结束符
if(' ' == *(a + count - 1))
{
*(a + count - 1) = '\0';
}
else
{
*(a + count) = '\0';
}
return a;
}
int main()
{
char a[20] = " i love china ";
// int len = strlen(a); 这里得到的长度是14。
// len = sizeof(a); 这里得到的长度是20。
char *b;
b = getString(a);
cout << strlen(b) << endl;
cout << b << endl;
if(NULL != b)
{
free(b);
}
system("pause");
return 0;
}