问题 #1:
您的函数返回一个指向堆栈上分配的(临时)字符串的指针。这意味着一旦你的函数结束,内存rtn
就会被释放,这会使char *
函数返回的指针无效。
你宁愿做的是:
void getstring(char str[], char rtn[])
{
/* Some processing on rtn... */
}
调用者getstring
应该处理作为rtn
.
问题 #2:
您的 while 循环将无限期运行,因为i
永远不会增加。放在i++
循环内的某个地方。
问题 #3:
您的if
-statement 中的条件有问题。你比较str[i]
, 这是 a char
, to " "
or "$"
, 它们是字符串文字('\0'
最后有)。这是错误的。
您需要将它们与用撇号(不是引号)表示的字符进行比较。
另外,请注意测试条件也是错误的。您需要一个逻辑 AND 运算符而不是 OR。将-statement
更改为:if
if (str[i] != ' ' && str[i] != '$')
问题#4:
什么rtn[i] = '';
意思?''
是一个空字符常量,这在 C 中是非法的。
你想跳过一个字符str
吗?
问题#5:
你有索引问题。因为str
andrtn
可能显然具有不同的长度,您需要管理两个运行索引,每个字符串一个。
问题 #6:
rtn
函数返回时不一定以 null 结尾。在函数返回之前(即-loop 结束之后)赋值'\0'
给 end 。rtn
rtn[i] = '\0';
while
这是您的代码,上面提到的所有问题都已修复:
void getstring(char str[], char rtn[])
{
int i = 0, j = 0;
while (i < strlen(str))
{
if (str[i] != ' ' && str[i] != '$')
rtn[j++] = str[i];
i++;
}
rtn[j] = '\0';
}
这是一个更有效的版本,它使用指针而不是索引,并且不使用strlen
:
void getstring(char *str, char *rtn)
{
while (*str)
{
if (*str != ' ' && *str != '$')
*rtn++ = *str;
*str++;
}
*rtn = '\0';
}