【问题标题】:How to return a const char* in a function?如何在函数中返回 const char*?
【发布时间】:2014-01-25 15:39:35
【问题描述】:

我给你们我的整个代码。有点长,真心希望你能看懂:

#include <iostream>
using namespace std;

char const* reverseWordsOnly(const char* s)
{
    int k;
    int p = strlen(s);


    for (int i = 0; i <= p; i++)
    {
        if (s[i] == ' ')
        {

            for (k = i - 1; (k != -1) && (s[k] != ' ') && (s[k] != ',') && (s[k] != ';') && (s[k] != '.'); k--)
                return &s[k];
            return " ";

        }
        if (s[i] == ',')
        {

            for (k = i - 1; (k != -1) && (s[k] != ' ') && (s[k] != ',') && (s[k] != ';') && (s[k] != '.'); k--)
                return &s[k];
            return ",";

        }
        if (s[i] == ';')
        {

            for (k = i - 1; (k != -1) && (s[k] != ' ') && (s[k] != ',') && (s[k] != ';') && (s[k] != '.'); k--)
                return &s[k];
            return ";";

        }
        if (s[i] == '.')
        {

            for (k = i - 1; (k != -1) && (s[k] != ' ') && (s[k] != ',') && (s[k] != ';') && (s[k] != '.'); k--)
                return &s[k];
            return ".";

        }
    }
}

int main()
{
    char s[1002];
    cin.getline(s, 1002, '\n');
    strcat(s, " ");
    reverseWordsOnly(s);
    return 0;
}

那么它的作用是什么......它反转了字符串中单词的字母顺序。例如,如果你写下Something.. terribly wrong.,它应该返回gnihtemoS.. ylbirret gnorw.间隔和点作为分隔符。问题是我必须使用这个非常精确的函数char const* reverseWordsOnly(const char*),我完全不知道如何使它与这些常量和指针一起工作。我编写的代码是完全可编译的,但在控制台中只返回一个空格。我做错了什么?有任何想法吗?如何在函数中返回那些指针值?

【问题讨论】:

  • 你真的输出了什么吗?我在这段代码中看不到任何应该在控制台中显示任何内容的内容。
  • @typ1232 我在四种 if 情况下return &amp;s[k].. 可能不对.. 我进行了实验,因为当我有一个指针时它不会让我return s[k]。跨度>
  • 这不是今天早些时候发布的 - 以为已经回答了......
  • 建议不要在收到答案后编辑您的帖子 - 或许可以附加您的最终想法。之前的帖子stackoverflow.com/questions/21350160/… 问题和答案在最终编辑中没有意义。
  • 您不能在 return 周围放置一个循环并假设您的函数将继续执行从每个 return 收集所有结果。它绝对不会那样做。

标签: c++ function pointers constants


【解决方案1】:
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

char const* reverseWordsOnly(const char* s){
    static string work;
    work = s;
    string::size_type start_pos = 0, end_pos;

    while(string::npos != (start_pos = work.find_first_not_of(" .,;", start_pos))){
        if(string::npos == (end_pos = work.find_first_of(" .,;", start_pos+1)))
            end_pos = work.length();
        reverse(&work[start_pos], &work[end_pos]);
        start_pos = end_pos + 1;
    }

    return work.c_str();
}

int main(){
    cout << reverseWordsOnly("Something.. terribly wrong.") <<endl;

    return 0;
}

【讨论】:

  • 我能问一下您为什么将static string work(s) 更改为static string work; work = s;,因为它事先也有效吗?
  • @user3213110 ;当您使用另一个字符串调用此函数时,它不会用作新字符串。
【解决方案2】:

要么我遗漏了一些东西,要么这应该会有所帮助: 1. 你得到一个 const char *,即使你想改变它。 const 关键字意味着您不打算更改变量的内容,所以我会摆脱它。 2.看起来你实际上并没有改变字符串,即使它是你的函数应该做的(按照你描述的方式) 3. 尝试使用 strtok 函数将您的句子分成单词。 4. 不要在函数中间返回随机字符串 - 写入单词,反转到新缓冲区(使用“new”关键字分配),并在 end处返回指向该缓冲区的指针> 你的功能。

如果这还不够,请告诉我,我可以回复一些可以完成这项工作的代码。

另外...您的函数返回 char *,但在您的主函数中,您从不将其返回值分配给变量。

【讨论】:

  • 谢谢,您可以查看我对这个问题的最新评论。我认为它更好地描述了这种情况。我尝试将所有返回值更改为 cout 并在函数结束时返回 0,但一切都搞砸了。当我输入What the,而不是tahW eht 时,它输出t the at the hat the What the e he the 。这个指针的东西对我来说真的很新,我并没有真正理解它的逻辑以及它在使用上与“非指针”有何不同,所以我并没有真正明白你告诉我的关于在另一个缓冲区中写入东西的内容。顺便说一句,正如我所说,可悲的是,我必须使用 const char* 而别无其他。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 2021-11-23
  • 2012-02-18
  • 2011-02-17
  • 2019-01-31
  • 2022-01-16
  • 2016-06-10
  • 1970-01-01
相关资源
最近更新 更多