尝试使字符串数组通过方法传递C++

Trying to make string array passed through methods C++

本文关键字:方法 C++ 字符串 数组      更新时间:2023-10-16

我正在尝试从用户那里读取姓名和年龄,直到用户输入"停止"。然后只需打印所有这些值。请帮助我,我只是初学者C++

// Pass.cpp
// Reading names and ages from user and outputting them
#include <iostream>
#include <iomanip>
#include <cstring>
using std::cout;
using std::cin;
using std::endl;
using std::setw;
using std::strcmp;
char** larger(char** arr);
int* larger(int* arr);
void read_data(char*** names, int** ages);
void print_data(char*** names, int** ages);
int main()
{
    char** names = new char*[5];
    char*** p_names = &names;
    int* ages = new int[5];
    int** p_ages = &ages;
    read_data(p_names,p_ages);
    print_data(p_names,p_ages);
}
void read_data(char*** names, int** ages)
{
    const char* sent = "stop";
    const int MAX = 15;
    int count = 0;
    char UI[MAX];
    cout << "Enter names and ages."
        << endl << "Maximum length of name is " << MAX
        << endl << "When stop enter "" << sent << "".";
    while (true)
    {
        cout << endl << "Name: ";
        cin.getline(UI,MAX,'n');
        if (!strcmp(UI, sent))
            break;
        if (count + 1 > sizeof (&ages) / sizeof (&ages[0]))
        {
            *names = larger(*names);
            *ages = larger(*ages);
        }
        *names[count] = UI;
        cout << endl << "Age: ";
        cin >> *ages[count++];
    }
}
void print_data(char*** names, int** ages)
{
    for (int i = 0; i < sizeof(*ages) / sizeof(*ages[0]);i++)
    {
        cout << endl << setw(10) << "Name: " << *names[i]
            << setw(10) << "Age: " << *ages[i];
    }
}
char** larger(char** names)
{
    const int size = sizeof(names) / sizeof(*names);
    char** new_arr = new char*[2*size];
    for (int i = 0; i < size; i++)
        new_arr[i] = names[i];
    return new_arr;
}
int* larger(int* ages)
{
    const int size = sizeof(ages) / sizeof(*ages);
    int* new_arr = new int[2 * size];
    for (int i = 0; i < size; i++)
        new_arr[i] = ages[i];
    return new_arr;
}

你真的把事情复杂化了。

给定原始问题:

编写一个读取数字(整数)和名称(小于)的程序 15 个字符)从键盘。设计程序,以便数据 在一个函数中完成,输出在另一个函数中完成。将数据存储在 main() 函数。当输入零时,程序应结束 数字。考虑如何在 功能

该问题希望您考虑将参数传递给函数。一个简单的解决方案是:

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
// Pass in a char array and an integer reference.
// These values will be modified in the function
void read_data(char name[], int& age)
{
    cout << endl << "Age: ";
    cin >> age;
    cin.ignore();
    cout << endl << "Name: ";
    cin.getline(name, 16);
}
// Pass a const array and an int value
// These values will not be modified
void print_data(char const *name, int age)
{
    cout << endl << setw(10) << "Name: " << name
            << setw(10) << "Age: " << age;
}
int main()
{
    char name[16];
    int age;
    cout << "Enter names and ages."
        << endl << "Enter 0 age to quit.";
    do {
            read_data(name, age);
        print_data(name, age);
    } while (0 != age)
}

编辑:根据用户3290289的评论修改

编辑2:在数组中存储数据

// Simplify by storing data in a struct (so we don't have to manage 2 arrays)
struct Person {
    char name[16];
    int age;
};
// Returns how many People were input
int read_data(Person*& arr)
{
    int block = 10; // How many persons to allocate at a time
    arr = NULL;
    int arr_size = 0;
    int index = 0;
    while (true) {
        if (index == arr_size) {
            arr_size += block;
            arr = (Person *)realloc(arr, arr_size * sizeof(Person)); // Reallocation
            // Should check for error here!
        }
        cout << endl << "Age: ";
        cin >> arr[index].age;
        cin.ignore();
        if (0 == arr[index].age) {
            return index;
        }
        cout << endl << "Name: ";
        cin.getline(arr[index++].name, 16);
    }
}
void print_data(Person *arr, int count)
{
    for (int i = 0; i < count; i++) {
        cout << endl << setw(10) << "Name: " << arr[i].name
            << setw(10) << "Age: " << arr[i].age;
    }
}
int main()
{
    Person *arr;
    int count = read_data(arr);
    print_data(arr, count);
    free(arr);  // Free the memory
}

试试这个:

#include <iostream>
#include <iomanip>
#include <vector>
#include <sstream>
using std::cout;
using std::cin;
using std::endl;
using std::setw;
using std::strcmp;
void read_data(std::vector<std::string> &names, std::vector<int> &ages);
void print_data(std::vector<std::string> &names, std::vector<int> &ages);
int main()
{
    std::vector<std::string> names;
    std::vector<int> ages;
    read_data(names, ages);
    print_data(names, ages);
}
void read_data(std::vector<std::string> &names, std::vector<int> &ages)
{
    const char* sent = "stop";
    cout << "Enter names and ages."
        << endl << "When stop enter "" << sent << "".";
    while (true)
    {
        std::string input;
        cout << endl << "Name: ";
        std::getline(cin, input);
        if (!strcmp(input.c_str(), sent))
            break;
        names.push_back(input);
        cout << endl << "Age: ";
        std::string age;
        std::getline(cin, age);
        ages.push_back(atoi(age.c_str()));
    }
}
void print_data(std::vector<std::string> &names, std::vector<int> &ages)
{
    for (int i = 0; i < names.capacity() ; i++)
    {
        cout << endl << setw(10) << "Name: " << names.at(i)
            << setw(10) << "Age: " << ages.at(i);
    }
}

我看到的一个问题是这个 if 语句:

if (count + 1 > sizeof (&ages) / sizeof (&ages[0]))

&ages 是一个 int** 的地址,一个指针,所以它的大小是 8(通常),因为这是指针类型的大小。该函数不知道数组的大小,sizeof 只会在同一范围内声明 ages 时返回正确答案。

sizeof(&ages) / sizeof(&ages[0])

将始终返回 1

我相信

关于这个问题的一个自然解决方案如下:

  1. 创建一个"std::map"实例。在这里,std::map 将根据年龄对元素进行排序。在这里,我的假设是将数据存储到容器中后,您希望找到有关特定学生年龄/最小/最大以及对数据的所有各种操作。一般来说,仅仅存储和打印数据没有多大意义。

  2. 创建一个"std::p air",并将用户的两个输入分别放入std::p air"第一"和"第二"成员中。现在,您可以将此"std::p air"实例值插入到上面的"std::map"对象中。

  3. 在打印时,您现在可以以"std::p air"的形式获取"std::map"的每个元素,然后您可以分别显示对"第一"和"第二"部分。