【问题标题】:How to return a C-String from a function and display it如何从函数返回 C-String 并显示它
【发布时间】:2020-12-19 02:21:44
【问题描述】:

我无法让我的程序显示整个 c 字符串,它只显示第一个字母!我正在尝试编写一个要求用户输入 2 个 c 字符串的函数。然后我有一个单独的函数来确定哪个 c-sting 按字母顺序更大,另一个要显示。每次它显示 c 字符串时,它只显示第一个字母。我无法弄清楚我做错了什么。我需要它来显示整个 c 字符串。

这是向用户询问两个 c 字符串的函数:

const char *getData(char *c, char *d)
{
    cout << "Enter the first c-string: ";
    cin.ignore();
    cin.getline(c, 50);
    cout << "Enter the second c-string: ";
    cin.getline(d, 50);
    return c, d;
}

这是比较 c 字符串的函数

const char findBigger(char *c, char *d)
{
    if (strcmp(c, d) == 0)
        return *c;
    else if (strcmp(c, d) < 0)
        return *c;
    else if (strcmp(c, d) > 0)
        return *d;
}

这里是显示输入和更大的 c 字符串的函数

void displayBigger(const char *c, const char *d, const char *maxChar)
{
    cout << "The first c-string is " << c << endl;
    cout << "The second char is " << d << endl;
    cout << "The bigger value is " << maxChar << endl;
    cout << "__________________________________________" << endl;
}

main()我有

char first[50],
second[50]'
maxArray[50];
getData(first, second);
*maxArray = findBigger(first, second);
displayBigger(*first, *second, *maxArray);

程序的输出是:

Enter the first c-string: apple pie
Enter the second c-string: peach pie
The first char is a
The second char is p
The bigger value is a
__________________________________________

如何让它打印整个 c 字符串?它应该显示“苹果派”和“桃派”

【问题讨论】:

  • *maxArray= 不会像您认为的那样做。它不会将整个数组复制到另一个数组。如果您尝试实际使用 C++ std::strings,那么这些都不是必需的。要真正做你想做的事,只需用std::strings 替换所有导致缓冲区溢出和内存损坏的产生地,也就是“数组”,并相应地调整代码。
  • return c, d; -- 这并不像你想象的那样。
  • findBigger 中,您使用相同的参数分别调用strcmp 3 次。您只需要一次调用并保存返回值。
  • @SamVarshavchik 我希望我可以使用std::string,但我的老师不希望我们使用它。
  • return c, d; 返回d。它太复杂了,无法解释为什么会这样(与逗号运算符有关)。无需返回任何内容,只需将getData 函数声明为返回void,而不是const char *

标签: c++ string c-strings strcmp


【解决方案1】:

您的代码有几个问题,尽管明显没有使用std::string

问题 1:

const char findBigger(char *c, char *d)
{
    if (strcmp(c, d) == 0)
        return *c;
    else if (strcmp(c, d) < 0)
        return *c;
    else if (strcmp(c, d) > 0)
        return *d;
}
  1. 这个函数应该返回const char *,而不是const char
  2. 您使用相同的参数集不必要地调用strcmp 3 次。您只需调用一次strcmp 并测试该值:

固定的代码可能如下所示:

const char* findBigger(const char *c, const char *d)
{
    if ( strcmp(c, d) <= 0 )
        return c;
    return d;
}

请注意,参数是 const char *,因为您没有更改 C 字符串中包含的数据。


问题 2:

char first[50],
second[50]'
maxArray[50];
getData(first, second);
*maxArray = findBigger(first, second);
displayBigger(*first, *second, *maxArray);
  1. 调用函数(假设它是main)将maxArray 声明为char 的数组,但应该声明为const char *

  2. displayBigger 的调用应该有指针传递给它。

这里是固定版本:

int main()
{
    char first[50],
    second[50];
    
    getData(first, second);
    const char *maxArray = findBigger(first, second);
    displayBigger(first, second, maxArray);
}

问题 3:

const char *getData(char *c, char *d)
{
    cout << "Enter the first c-string: ";
    cin.ignore();
    cin.getline(c, 50);
    cout << "Enter the second c-string: ";
    cin.getline(d, 50);
    return c, d;
}

getData 不需要返回const char *,因为参数是指向将被填充的char 缓冲区的指针。然后这一行:

return c, d;

不返回两个值,仅返回 d 由于逗号运算符。这成为一个有争议的问题,因为一旦函数被声明为void,就没有必要了。

固定版本:

void getData(char *c, char *d)
{
    cout << "Enter the first c-string: ";
    cin.ignore();
    cin.getline(c, 50);
    cout << "Enter the second c-string: ";
    cin.getline(d, 50);
}

【讨论】:

  • 非常感谢!对此,我真的非常感激。这对我未来的任务也很有帮助。
猜你喜欢
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2016-11-27
  • 2021-07-02
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
相关资源
最近更新 更多