【问题标题】:Initializing an array of string pointers and print the same through a function call not Working, Why?初始化一个字符串指针数组并通过函数调用打印它不起作用,为什么?
【发布时间】:2015-10-15 19:02:48
【问题描述】:

我必须初始化一个字符串指针数组以指向 4 个工作人员名称。然后我想调用一个函数 func1() 打印出所有的名字。 我必须使用通过referebce 或值传递或者可能是这些的混合来做到这一点,任何事情都可以。

我已经通过以下类似类型的查询

how to initialize string pointer?

c++ initialization of an array of string pointers

returning array of string from function not working as expected

还尝试使用 Books Deitel 和 deitel 和 C++ 入门 然而,无法理解或澄清我对字符串指针数组的理解,以至于现在我什至对它的基本原理感到困惑。

虽然根据我在下面编写的代码,我在网上经历了许多类似的问题,但我只能做到这一点。

我的代码:-

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

void func1(string *str, int *num)
{
    for (int i = 0; i <= (*num); i++)
    {
        cout<<"\n"<<str[i]<<"\n";
    }
    cout<<"reached to the end of calling function\n\n";
}

int main() 
{
    int num; 
    cout<<"\nplease input your prefered size of array\n";
    cin >> num;  // Number of  names elements
    cout<<"\nplz enter the desired names\n";
    string *str = new string[num];
    for (int i=0;i<num;i++)
    {
        getline(cin, str[i]);
    }

    cout<<"now printing all the names through a calling function\nusing appropriate parameters\n";

    func1(str, &num);

    return 0;
}

当前行为:-

代码执行并接受我的输入,但只要我给出倒数第二个值,它就会提示错误提示“file1.exe 已停止工作”。但是,它会继续执行剩余的任务并调用 func1() 并打印被调用函数的结束行。

输出:

请输入您喜欢的数组大小

4

请输入所需的名称

普拉提克

普拉提克维亚斯

Pratik Vyas A

现在通过调用函数打印所有名称 使用适当的参数

普拉提克

普拉提克维亚斯

Pratik Vyas A


进程在 14.24 秒后退出,返回值 255 按任意键继续 。 . .



而且我必须关闭终端,因为我一输入第三个名称 Pratik Vyas A 就会收到提示错误,如上所述。

我知道这可能是一些非常基本的问题,但只有当我的大脑可以处理在线给出的其他多种方式时,我才会将这个问题空间留给其他一些有价值的重要问题。 任何高度赞赏的帮助。

【问题讨论】:

  • 你为什么要通过指针传递num
  • 如果您没有遇到std::stringstd::vector,您就读错书了;)
  • @CodeMan 但为什么呢?为什么不按值传递int
  • 你有读取数字的代码,但你想要的是读取一行。
  • func1for 循环转到&lt;= num,它位于数组末尾之后。

标签: c++ arrays string function pointers


【解决方案1】:

如果添加行

cin.ignore();

在读取输入之前,这不会发生。

问题的根源在于当你用 cin like 读取输入时

cin >> num;

cin 读取到换行符,并停在那里(在换行之前,将换行留在缓冲区中)。当您调用getline 时,它首先看到的是用户输入数字时缓冲区中留下的\n,因此您在数组的第一个元素中得到一个空字符串。请注意您的代码在打印名称之前如何留下三行空白,而您只告诉它留下一行 - 这是因为这些行的中间是(空的)第一个字符串。

这是进行了更改的main 方法,我已经在我的计算机上测试了此代码,它可以正常工作:

int main()
{
    int num;
    cout<<"\nplease input your prefered size of array\n";
    cin >> num;  // Number of  names elements
    cout<<"\nplz enter the desired names\n";
    string *str = new string[num];
    cin.ignore();
    for (int i=0;i<num;i++)
    {
        getline(cin, str[i]);
    }

    cout<<"now printing all the names through a calling function\nusing appropriate parameters\n";

    func1(str, &num);

    return 0;
}

【讨论】:

  • OHH !!!........这对我来说是一个关于重复使用我的换行符的新知识。我这样做是出于对整洁的贪婪,但现在我看到它是如何搞砸的......谢谢现在正在尝试它
  • 抱歉,可能不清楚 - 流中留下的换行符 not 是打印语句中的换行符,它是用户输入时的换行符数字。这只是 cingetline() 工作方式的一个怪癖。
  • 不,它没有用我尝试从所有可能的位置中删除换行符,该位置围绕读取 num 的语句............当我运行程序时仍然出现错误.提示错误。
  • 阅读我编辑的帖子 - 您无需从代码中删除任何换行符。如果您回到您在问题中发布的内容,但只需在开始循环以获取输入之前添加行 cin.ignore();(为清楚起见,我会将整个部分添加到我的答案中),它可以工作。
  • 是的,对循环条件的更改对于避免超出数组范围也很重要。结合我现在回答中的main 函数版本,您的程序应该可以完全按照需要运行。
【解决方案2】:

在您将数字读入num 之后,它后面的换行符仍在流中,因此循环的第一次迭代读取一个空字符串。

您可以通过更改循环来自己调试它以显示它在做什么:

for (int i=0;i<num;i++)
{
    if (getline(cin, str[i]))
      cout << "got: " << str[i] << std::endl;
    else
      cerr << "Failed to read!\n";
}

你应该学会像这样调试自己的代码,找出它真正在做什么,而不是在这里问。

【讨论】:

  • 同意,我是调试功能的新手,老实说并没有太多使用它,只是因为担心我可能会分心到另一个我可能无法理解的疑问。
  • 它没有用,我尝试删除换行符并使用 getline 但没有用。
【解决方案3】:

使用vectorstring

typedef std::vector<std::string> stringVec;

void foo(const stringVec& names){
    for (int i=0;i<names.size();i++){std::cout << names[i] << std::endl;}
}

int main(){
    stringVec s;
    s.push_back("Peter");
    s.push_back("Klaus");
    foo(s);
}

...并且不要使用using namespace std;(找不到链接但我会寻找它)

【讨论】:

  • 谢谢,现在我明白了......是的......虽然根据你的回答,我应该在没有矢量或模板的情况下做到这一点,我也不擅长这些功能。跨度>
【解决方案4】:

从针对该问题发布的 cmets 中,一条特定的评论指出了代码设计中的一个主要的、根本的和明显的缺陷,当纠正后,代码可以正确地实现主要目的。 由@crashmstr 回复

“func1 的 for 循环转到

,因此在大多数编译器(通常是所有编译器)中表现出“超出范围”或“超出范围”的行为,其中一些编译器仍然在提示框错误旁边的屏幕上给出最终输出,例如例如:- codeblocks、devcpp、codebox、scripter 等。 感谢。

以下是代码中的小而具体的更正

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

void func1(string *str, int *num)
{
    for (int i = 0; i < (*num); i++)
    {
        cout<<"\n"<<str[i]<<"\n";
    }
    cout<<"reached to the end of calling function\n\n";
}

int main() 
{
    int num; 
    cout<<"\nplease input your prefered size of array\n";
    cin >> num;  // Number of  names elements
    cout<<"\nplz enter the desired names\n";
    string *str = new string[num];
    cin.ignore();   //important input by @Chris Hengler as it controls
                    // aspects of out of bounds behaviour prevention
    for (int i=0;i < num;i++)
    {
        getline(cin, str[i]);
    }

    cout<<"now printing all the names through a calling function\nusing appropriate parameters\n";

    func1(str, &num);

    return 0;
}

现在工作正常。感谢 Chris 和 Crash 的回复。

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 2021-12-05
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2017-09-19
    • 1970-01-01
    相关资源
    最近更新 更多