函数获取一个字符串,并在C中处理后返回该字符串
我正在编写一个需要函数的代码。此函数获取一个字符串作为输入,并返回一个字符串 到目前为止,我计划获得一个函数获取一个字符串,并在C中处理后返回该字符串,c,string,C,String,我正在编写一个需要函数的代码。此函数获取一个字符串作为输入,并返回一个字符串 到目前为止,我计划获得一个str[],删除所有$和空格,并将其存储在另一个字符串中,稍后返回: char *getstring(char str[]) { int i=0; char rtn[255]; while (i<strlen(str)) { if (str[i] != " " || str[i] != "$" ) rtn[i] =
str[]
,删除所有$
和空格,并将其存储在另一个字符串中,稍后返回:
char *getstring(char str[])
{
int i=0;
char rtn[255];
while (i<strlen(str))
{
if (str[i] != " " || str[i] != "$" )
rtn[i] = str[i];
else
rtn[i] = '';
}
return str;
}
char*getstring(char str[])
{
int i=0;
字符rtn[255];
而(i问题#1:
函数返回指向堆栈上分配的(临时)字符串的指针。这意味着一旦函数结束,rtn
的内存将被释放,这将使函数返回的char*
指针无效
您更愿意做的是:
void getstring(char str[], char rtn[])
{
/* Some processing on rtn... */
}
getstring
的调用者应该处理作为rtn
传递的字符串的分配和解除分配
问题#2:
while循环将无限期运行,因为i
从不增加。请将i++
放在循环中的某个位置
问题#3:
if
-语句中的条件是错误的。您将str[i]
(一个char
)与”
或“$”
)进行比较,这是错误的。
您需要将它们与用撇号(而不是引号)表示的字符进行比较。
另外,请注意,测试条件也是错误的。您需要一个逻辑AND运算符而不是OR。
将if
-语句更改为:
if (str[i] != ' ' && str[i] != '$')
问题4:
rtn[i]='';是什么意思?''
是一个空字符常量,在C中是非法的。
是否要跳过str
中的字符
问题#5:
您有索引问题。因为str
和rtn
的长度可能明显不同,您需要管理两个运行索引,每个字符串一个
问题#6:
rtn
在函数返回时不一定以null终止。在函数返回之前将'\0'
分配到rtn
的末尾(即rtn[i]='\0';
在之后,而-循环结束)
以下是修复了上述所有问题的代码:
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';
}
它肯定无法工作。您没有增加“i”计数器,并且“”的赋值不会跳过符号
就地变量(速度方面不是最佳值)
#包括
#包括
void getstring(char*str)
{
intj,i=0,len=strlen(str);
而(我
还有重新分配的变体
char *getstring(const char* str)
{
int i_src = 0;
int i_dest = 0;
int len = strlen(str);
char* rtn = (char*)malloc(len + 1);
while (i_src < len)
{
char ch = str[i_src];
if ( (ch != ' ') && (ch != '$') )
{
rtn[i_dest] = ch;
/// increment destination index here
i_dest++;
}
/// increment the source index always
i_src++;
}
rtn[i_dest] = 0;
return rtn;
}
char*getstring(const char*str)
{
int i_src=0;
int i_dest=0;
int len=strlen(str);
char*rtn=(char*)malloc(len+1);
while(i_src
以后不要忘记释放()结果
如果要从函数返回新字符串,应动态分配字符串的内存。在代码char rtn[255];
中,为堆栈上的rtn
分配内存,它将在退出函数后被清除。您应编写:
char*rtn=(char*)malloc(strlen(str))
当然,您应该跟踪内存以防止内存泄漏,并调用free()
释放内存
“”的赋值不会跳过符号,当您看到不需要的符号时,您不应该递增i
(并且您已经错过了代码中的增量)
如果返回的值错误,则应返回rtn
,而不是str
正确的代码如下所示:
char *getstring(char str[])
{
int i=0, rtn_pos = 0;
size_t len = strlen(str);
char *rtn = (char*) malloc(len + 1);
for (i = 0; i < len; ++i)
if (str[i] != ' ' && str[i] != '$' )
rtn[rtn_pos++] = str[i];
rtn[rtn_pos] = '\0';
return rtn;
}
char*getstring(char str[])
{
int i=0,rtn_pos=0;
尺寸长度=strlen(str);
char*rtn=(char*)malloc(len+1);
对于(i=0;i
最好让调用者提供目标字符串(调用者可能知道它应该有多大),然后返回它不知道的内容:写入rtn[]数组的字节数
size_t mygetstring(char *rtn, char *str)
{
size_t pos, done;
for (pos=done=0; rtn[done] = str[pos]; pos++)
{
if (rtn[done] == ' ' || rtn[done] == '$' ) continue;
done++;
}
return done; /* number of characters written to rtn[], excluding the NUL byte */
}
比较字符文字时使用单引号。并使用malloc(strlen(str)+1)
而不仅仅是strlen(str)
OUAH,感谢指向“0”的内存字节缺失,但最好是离开Maloc铸件。是的,在STD C中不需要从Malc中进行转换,但是如果代码将被编译为C++,那么它将是一个错误。循环中的String()仍然很难看:字符串的长度只需要占用一次。循环比while循环体末尾松散的++i;
更不容易发生事故。wildplasser,你完全正确。我会考虑你的笔记。什么大小?上帝!!你是用C:O说话吗?大小是一个无符号的类型,足以容纳任何对象的大小。例如strlen()的类型s返回值,或malloc()的参数。以及sizeof运算符生成的类型。Viktor,是的,这确实帮助我提出了很多问题!:)让我完成并返回给你!你为什么不在t中返回str
char *getstring(char str[])
{
int i=0, rtn_pos = 0;
size_t len = strlen(str);
char *rtn = (char*) malloc(len + 1);
for (i = 0; i < len; ++i)
if (str[i] != ' ' && str[i] != '$' )
rtn[rtn_pos++] = str[i];
rtn[rtn_pos] = '\0';
return rtn;
}
size_t mygetstring(char *rtn, char *str)
{
size_t pos, done;
for (pos=done=0; rtn[done] = str[pos]; pos++)
{
if (rtn[done] == ' ' || rtn[done] == '$' ) continue;
done++;
}
return done; /* number of characters written to rtn[], excluding the NUL byte */
}