【问题标题】:simple char pointer sending to function not working发送到函数的简单字符指针不起作用
【发布时间】:2012-12-11 08:38:28
【问题描述】:

我正在尝试编写 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);

}

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

所以我尝试修复和改变一些事情: 改变这个:定义 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);

}

【问题讨论】:

标签: c string pointers char


【解决方案1】:

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

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

【讨论】:

  • “findComplex 函数已原型化”是什么意思?好的,所以我尝试更改:define char *str;作为全局参数。
  • 并像这样更改函数: void read_comp(void) { printf("you have enter: read_comp FUNCTION\n"); *str = readAndRemove(); printf("%s\n",str);查找复杂(str); }
  • @Yuval 函数原型只是函数在使用前的声明,因此编译器可以识别它。 findComplex 函数的原型如下所示:void findComplex(char *); 不过这并不能解决您最大的问题。
  • 不知道这个名字是原型 :-)
【解决方案2】:

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

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] 请尝试确定您是使用“camelcase”还是“_”名称。您的函数应该是read_and_removeread_compreadAndRemovereadComp。我几乎写错了,因为我希望在两个函数中找到相同的风格——当你以后尝试改变某些东西时,这种事情会让你发疯。

【讨论】:

    猜你喜欢
    • 2012-07-03
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多