函数获取一个字符串,并在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*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 */
}