【问题标题】:vector with characters displaying显示字符的矢量
【发布时间】:2013-09-08 01:14:42
【问题描述】:

我在显示注册表中输入的数据时遇到问题。我编写的以下程序仅显示最后一个寄存器。( ziua=day , inregistrari=registers, data=date (ex. 03.02.2013))

#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int main()
{
    char ziua[30],data[30],inregistrari[90];
    int n,i;
    cout<<"INPUT DATA"<<endl;
    system("Pause");
    cout<<"\nEnter the day in which you want to perform the register: ";
    cin>>ziua;
    cout<<"\nDATE:";
    cin>>data;
    cout<<"\nEnter the number of registers you wanna perfom for the day "<<ziua<<":";
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cout<<"\nRegister "<<i<<":";
        gets(inregistrari);
    }
    cout<<"The data for the day of "<<ziua<<" are the following: ";
    cout<<"\nDATE: "<<data;
    for(i=1;i<=n;i++)
    cout<<"\n"<<inregistrari;
    getch();
}

【问题讨论】:

    标签: c++ arrays string io formatting


    【解决方案1】:
    1. 您正在使用 C++ 进行编程,您应该使用 std::string 而不是 C 样式的字符串。
    2. inregistrari[90] 是一个字符数组,足以容纳 1 个最大长度为 89 chars 的字符串(+ 终止字符),但您的循环似乎将其视为一个数组或字符串(尽管在这种情况下 gets(inregistrari);继续重写相同的字符串)
    3. 函数gets 通常已被弃用,在C 中你应该使用fgets 代替(但这是C++,因此这里真正的解决方案应该是使用std::getline
    4. 请在此处使用 std::vector&lt;std::string&gt; 而不是 C 样式的数组。
    5. 打印inregistrarifor 循环的主体中,但是这个循环的每次迭代都做同样的事情(打印不依赖于i
    6. 全局空间内的using namespace std; 是一种不好的做法
    7. 您不必在函数开头声明所有变量,这在旧 ANSI C(大约 20 年前)中是必需的

    下面是一个示例:

    #include <iostream>
    #include <string>
    #include <vector>
    
    int main()
    {
        std::string day, date;
        int registerCount;
    
        std::cout << "INPUT DATA"
                  << std::endl << std::endl
                  << "Enter the day in which you want to perform the register: "
                  << std::endl;
        std::cin >> day;
        std::cout << "DATE:" << std::endl;
        std::cin >> date;
        std::cout << "Enter the number of registers you wanna perfom for the day "
                  << day << ":" << std::endl;
        std::cin >> registerCount;
    
        std::vector<std::string> registers(registerCount);
        for (int i = 0; i < registerCount; ++i)
        {
            std::cout << "Register " << i << ":" << std::endl;
            std::getline(std::cin, registers[i]);
        }
    
        std::cout << "The data for the day of " << day << " are the following: "
                  << std::endl;
    
        std::cout << "DATE: " << date << std::endl;
        for (int i = 0; i < registerCount; ++i)
            std::cout << registers[i] << std::endl;
    }
    

    请注意,您可以用if 语句包装std::getline(std::cin, registers[i]) 并检查是否返回了有效的流对象,如果是空行,它将读取空字符串,因此您还可以确保!registers[i].empty()

    【讨论】:

    • 那么我应该怎么做才能将每​​个寄存器写入一个单独的数组?
    • @CokeThe:给我第二个,我给你写:)
    • 如果我不声明变量,我的编译器将无法识别它们
    • @CokeThe:纯粹出于好奇:您使用的编译器到底是什么?顺便说一句,现在检查我的答案,我还添加了一些关于 std::getline 的附加信息
    • 我为您将规则 7 应用于向量:/ 另外,我会考虑将 int 转换为 size_t 并在 std::cin 上添加一些流状态检查。公平地说,这超出了这个问题的范围
    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多