0

我正在尝试编写 3 个函数: 第一个:“read_comp”初始化一个 char 指针并为其分配“readAndRemove”返回的函数。readAndRemove 从用户读取的行并删除字符串之前的所有空格,并返回指向字符串的指针,开头没有空格。然后“read_comp”打印“readAndRemove”得到的字符串——没有空格的字符串。

最后一个函数 - 我有问题的那个...... 函数“findComplex”:我试图这个函数做的只是获取char指针并打印函数得到的字符串。

void read_comp(void)
{
    char *str = readAndRemove();
    printf("%s\n",str);
    findComplex(&str);
}

-------------

char * readAndRemove() /**function to read rest of input and remove first space**/
{
    char tempChar[30];
    fgets(tempChar,30,stdin);
    char* ptr = strtok(tempChar, " ");
    return ptr;
}

--------------
void findComplex(char* str)
{
    printf("in findComplex:%s\n",str);

}

(对不起,如果开始无关紧要,但我认为我做所有事情的方式可能有问题......)

所以我试图修复和改变一些事情: 改变这个:define char *str; 作为全局参数并更改功能:

void read_comp(void)
{
    *str = readAndRemove();
    printf("%s\n",str);
    findComplex(str);
}

char * readAndRemove() /**function to read rest of input and remove first space**/
{
    char tempChar[30];
    fgets(tempChar,30,stdin);
    char* ptr = strtok(tempChar, " ");
    return ptr;
}


void findComplex(char* str)
{
    printf("%s\n",str);
    printf("in findComplex:%s\n",str);

}
4

2 回答 2

0

函数中的变量已经是一个str指针。read_comp您对地址运算符的使用&使其成为指向指针的指针(即 type char **)。只需确保在findComplex调用函数之前对其进行原型化,并且不要使用 address-of 运算符。

不过,您有一个更大的问题,那就是该readAndRemove函数返回一个指向局部变量的指针。请记住,局部变量存储在堆栈中,并且当函数返回时,该堆栈空间被回收以供其他函数调用重用。而是在函数中创建数组read_comp,并将其连同其大小一起传递给readAndRemove函数。

于 2012-12-25T09:55:55.300 回答
0

如果您在编译器中启用警告(我说的是“请执行此操作!”),您会收到一条警告说“返回指向局部变量的指针”或类似的内容:

char * readAndRemove() /**function to read rest of input and remove first space**/
{
    char tempChar[30];
    fgets(tempChar,30,stdin);
    char* ptr = strtok(tempChar, " ");
    return ptr;
}

你不能返回指向局部变量的指针,因为当你从这个函数返回时,tempchar 使用的空间(ptr 将指向的空间)将被下一个函数重用——而且很可能下一个函数会写一些不同于你的东西串到这个内存中。

我建议的解决方案是将 tempchar 移至read_comp()[1],并将字符串传递给readAndRemove.

[1] 请尝试确定您是使用“驼峰”还是“_”名称。您的函数应该是read_and_removeandread_compreadAndRemoveand readComp。我几乎写错了,因为我希望在两个函数中找到相同的样式 - 当您稍后尝试更改某些内容时,这种事情会让您发疯。

于 2012-12-25T13:03:48.017 回答