我有一个fucntion,其中我想返回一个根本没有空格的字符串(即字符数组)。这是我的代码,我的理解不正确:
char *ignoreSpace( char helpArr[], int length ){
int i = 0; int j = 0;
char withoutSpace[length];
while ( i < length ){
/*if not a space*/
if ( isspace( helpArr[i] ) == FALSE )
withoutSpace[j] = helpArr[i];
i++;
}
return *withoutSpace;
}
我在行中的意图:
return *withoutSpace;
是返回没有空格的数组的内容,以便我可以完全解析一个没有空格的字符串。
您能告诉我如何使它变得更好吗?
当功能返回时,您的当前解决方案将失去withoutSpace
的结果,因为仅在该函数的范围中定义了该函数。
更好的模式是接受该函数的第三个参数,该函数是指向char[]
的指针,以将结果写入 - 以标准函数的方式几乎相同(例如strcpy
。
char* ignoreSpace(char* src, char* dst, int length) {
// copy from src to dst, ignoring spaces
// ...
// ...
return dst;
}
尝试此(假设NULL终止字符串)
void ignoreSpace(char *str) {
int write_pos = 0, read_pos = 0;
for (; str[read_pos]; ++read_pos) {
if (!isspace(str[read_pos]) {
str[write_pos++] = str[read_pos];
}
}
str[write_pos] = 0;
}
您无法将指针从函数返回到局部变量,因为一旦离开函数,所有局部变量都被拆下了并且不再有效。
您必须
-
在您的功能中将空间分配给
malloc
并返回指针分配的内存 -
不要从函数返回指针直接模型原始字符串。
第一个解决方案:
char *ignoreSpace(char helpArr[], int length)
{
int i=0; int j=0;
char *withoutSpace = malloc(length) ;
while(i <= length)
{
/*if not a space*/
if(isspace(helpArr[i]) == FALSE)
withoutSpace[j++] = helpArr[i];
i++;
}
return withoutSpace;
}
第二个解决方案:
char *ignoreSpace(char helpArr[], int length)
{
int i=0; int j=0;
while(i <= length)
{
/*if not a space*/
if(isspace(helpArr[i]) == FALSE)
helpArr[j++] = helpArr[i];
i++;
}
return helpArr;
}
我的代码中还有其他一些小修正。找出读者的练习。
您永远不会增加j
。如果源字符串的当前字符不是一个空间,您可能希望将其存储在输出字符串中,然后将j
递增一个;这样您就将下一个可能的字符存储到下一个插槽中,而不是一次又一次覆盖0
。
所以更改此信息:
...
withoutSpace[j] = helpArr[i];
...
进入这个:
...
withoutSpace[j++] = helpArr[i];
...
,然后还用0
或' '
(它们是相同)附加withoutSpace
,以便任何字符串处理函数都可能知道其结束。还要返回指针,因为您应该这样做,而不是*withoutSpace
或withoutSpace[0]
(它们是相同的):
char *ignoreSpace( char helpArr[], int length ){
int i = 0; int j = 0;
char * withoutSpace = malloc( length * sizeof * withoutSpace ); // <-- changed this
while ( i < length ){
/*if not a space*/
if ( isspace( helpArr[i] ) == FALSE )
withoutSpace[j++] = helpArr[i]; // <-- replaced j with j++
i++;
}
withoutSpace[j] = 0; // <-- added this
return withoutSpace;
}
,然后假设您可以拥有可变的长度数组。
编辑:好吧,是否可以使用malloc
或calloc
或其他东西,最好只使用动态内存分配,因为否则,根据注释,您将返回本地指针变量。当然,这需要您在最后手动free
分配的内存。