注册 登录
编程论坛 C++教室

写编程练习,运行异常,不知道问题在哪,求大佬

gzy444 发布于 2020-01-16 17:51, 4548 次点击
#include<iostream>
#include<string>
using namespace std;
struct car { string name; int year; };
int main() {
    cout << "How many cars do you wish to catalog?";
    int a;
    cin >> a;
    cin.get();
    car* A = new car[a];
    for (int i = 0; i <= a; i++) {
        cout << "Car #" << i + 1 << ":" << endl;
        cout << "Pleaseenter the make:";
        getline(cin, A[a].name);
        cout << "Please enter the year made:";
        cin >> A[a].year;
        cin.get();
    };
    cout << "Here is your collection:" << endl;
    for(int j=0;j<=a;j++)
    cout << A[j].year << " " << A[j].name << endl;
    delete[] A;
    return 0;
}

输入int值a之后提示异常:
引发了异常: 写入访问权限冲突。
**_Left** 是 0x51EE1DC。

这是哪出问题了,语句写的不对么?

[此贴子已经被作者于2020-1-16 19:32编辑过]

13 回复
#2
rjsp2020-01-16 18:55
编译异常
输入int值a之后提示异常:引发了异常: 写入访问权限冲突。**_Left** 是 0x51EE1DC。
你这明明是“运行异常”

输入int值a之后提示异常
不要说这么抽象的话,直接说输入“123”后提示异常、输入“一百二十三”后提示异常、输入“9999999999999999999999999999999999999999”后提示异常、……

car* A = new car[a];
for (int i = 0; i <= a; i++) {
for(int j=0;j<=a;j++)
数组越界了,改 <= 为 < 。
#3
gzy4442020-01-16 19:32
回复 2楼 rjsp
嗯。。。。我是萌新,也不知道该咋描述。。。。
改完<号之后还是那个提示:

引发了异常: 写入访问权限冲突。
**_Left** 是 0x239CA18C。

下面是异常的时候VS里弹出的一个叫xstring标签页的里面打叉的语句
    static _CONSTEXPR17 void assign(_Elem& _Left, const _Elem& _Right) noexcept {
        _Left = _Right;

#4
gzy4442020-01-16 19:45
回复 2楼 rjsp

刚百度了下 数组越界 ,说的是数组下标超出或者等于数组元素数,我改了new car[a+1]之后确实可以了。
难道这种输入变量作为数组元素数必须要有+1么?

蒙了,输出的是一组数字(貌似是类型转换?),百度了下C++Primer plus第五章第7题的答案,跟我的程序一样,而且数组后面没有+1.。。

[此贴子已经被作者于2020-1-16 20:00编辑过]

#5
叶纤2020-01-16 20:19
你这是萌新中的大佬啊?虽然听了一天的英语。但是你代码中的英文我看到泪牛满面,我还想学习来着,但是我看了一会儿真的看不懂码是要干啥的(=_=)原谅小白的无知。。。这题目到底啥意思啊?😱要做什么啊?
#6
gzy4442020-01-16 22:36
回复 5楼 叶纤
额。。。我这是C++primer第五章的课后练习题。。。
都是非常简单的语句,刚学,写的比较粗糙。。。
咱俩都是新手,我觉得你完全没必要去把语句里的每个单词都弄清楚啥意思,只要知道他是干啥用的就行了(我就是)。当然,要是知道本来的意思应该会更容易理解记忆。
题目是下面这个:

7. 设计一个名为car的结构,用它存储下述有关汽车的信息: 生产商(存储在字符数组或string对象中的字符串)、生产年份(整数)。编写一个程序,向用户询问有多少辆汽车。随后,程序使用new来创建一个由相应数量的car结构组成的动态数组。接下来,程序提示用户输入每辆车的生产商(可能由多个单词组成)和年份信息。请注意,这需要特别小心,因为它将交替读取数值和字符串(参见第4章)。最后,程序将显示每个结构的内容。该程序的运行情况如下:
How many cars do you wish to catalog? 2
Car #1:
Please enter the make: Hudson Hornet
Please enter the year made: 1952
Car #2:
Please enter the make: Kaiser
Please enter the year made: 1951
Here is your collection:
1952 Hudson Hornet
1951 Kaiser
————————————————
版权声明:本文为CSDN博主「wyl1813240346」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.
#7
叶纤2020-01-16 22:38
#include<iostream>
#include<string>
using namespace std;
struct car { string name; int year; };
int main() {
    cout << "有多少辆车";
    int a;
    cin >> a;
    cin.get();
   
    car* A = new car[a];
    for (int i = 0; i <a; i++) {//如果等于a就是多一个车
        cout << "Car #" << i + 1 << ":" << endl;
        cout << "生产商";
        getline(cin, A[i+1].name);//A[a]你是想输入第a辆车的名字吗
        cout << "年份";
        cin >> A[i+1].year;//A[a]你是想输入第a辆车的年吗
        cin.get();//你知道这里为什么用cin.get吗
        
    };
    cout << "收集信息" << endl;
    for(int j=1;j<=a;j++)
    cout << A[j].year << " " << A[j].name << endl;
    delete[] A;
    return 0;
}
你想要的结果是这样的吗
只有本站会员才能查看附件,请 登录
#8
叶纤2020-01-16 22:39
我查英语单词查到吐血
#9
rjsp2020-01-17 09:49
回复 3楼 gzy444
你代码中还有处“A[a]”需要改为“A[i]”

好好写代码的话,代码应该类似于
程序代码:
#include <iostream>
#include <string>
#include <limits>
#include <new>
using namespace std;

struct car
{
    std::string name;
    unsigned year;
};

int main( void )
{
    cout << "How many cars do you wish to catalog?";
    size_t n;
    if( !(cin>>n) )
        return 1;
    cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

    car* p = new(nothrow) car[n];
    if( !p )
        return 2;
    for( size_t i=0; i!=n; ++i )
    {
        cout << "Car #" << i+1 << ":\n";

        cout << "Please enter the make:";
        if( !getline(cin,p[i].name) )
            return 1;

        cout << "Please enter the year made:";
        if( !(cin>>p[i].year) )
            return 1;
        cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    };

    cout << "Here is your collection:\n";
    for( size_t i=0; i!=n; ++i )
        cout << p[i].year << " " << p[i].name << '\n';

    delete[] p;
}

其中,“car* p = new(nothrow) car[n];”是不好的,因为没法保证调用者不会忘了delete[] p。故而应该用 std::unique_ptr<car[]> p{ new car[n] }; 替代
程序代码:
#include <iostream>
#include <string>
#include <limits>
#include <new>
#include <memory>
using namespace std;

struct car
{
    std::string name = {};
    unsigned year = 0;
};

int main( void )
{
    cout << "How many cars do you wish to catalog?";
    size_t n;
    if( !(cin>>n) )
        return 1;
    cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

    std::unique_ptr<car[]> p{ new(nothrow) car[n] };
    if( !p )
        return 2;
    for( size_t i=0; i!=n; ++i )
    {
        cout << "Car #" << i+1 << ":\n";

        cout << "Please enter the make:";
        if( !getline(cin,p[i].name) )
            return 1;

        cout << "Please enter the year made:";
        if( !(cin>>p[i].year) )
            return 1;
        cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    };

    cout << "Here is your collection:\n";
    for( size_t i=0; i!=n; ++i )
        cout << p[i].year << " " << p[i].name << '\n';
}


#10
gzy4442020-01-17 10:03
回复 9楼 rjsp
对对对!改成A(i)就对了!是我太粗心了,A[a]是个固定的结构下标,A[i]才应该对!!!
检查那么多遍没检查出来,我太粗心了。。
谢谢大佬~!
还有就是大佬你给的这两段代码没看懂,比如那个return 1还有就是声明动态结构那个语句。。。可能是我刚开始学,好多都看不懂。。。我接着往下看吧,一点一点来,第六章就有if之类的分支语句了~
再次感谢!

[此贴子已经被作者于2020-1-17 10:17编辑过]

#11
gzy4442020-01-17 10:04
回复 7楼 叶纤
嗯对!就是这个!A[a]改成A[i]。自己太粗心了,没注意到
还有就是你这个手机端叫啥

下面是自己写的最终版
#include<iostream>
#include<string>
using namespace std;
struct car { string name; int year; };
int main() {
    cout << "How many cars do you wish to catalog?";
    int a;
    cin >> a;
    cin.get();
    car* A = new car[a];
    for (int i = 0; i < a; i++) {       //这是个循环(for语句),当i<a时,执行大括号里的语句;然后i自增1继续判定i<a
        cout << "Car #" << i + 1 << ":" << endl;
        cout << "Pleaseenter the make:";
        getline(cin, A[i].name);
        cout << "Please enter the year made:";
        cin >> A[i].year;
        cin.get();     //cin.get()是为了丢弃上面cin>>A[i].year输入后产生的换行符,否则下次输入时读到换行符会跳过输入
    };
    cout << "Here is your collection:" << endl;
    for(int j=0;j<a;j++)
    cout << A[j].year << " " << A[j].name << endl;
    delete[] A;
    return 0;
}


另外,9楼版主大佬写的那个应该看看(虽然好多看不懂),尤其是delete[]这个,确实很多时候会忘

[此贴子已经被作者于2020-1-17 10:13编辑过]

#12
叶纤2020-01-17 11:48
以下是引用gzy444在2020-1-17 10:04:32的发言:

嗯对!就是这个!A[a]改成A。自己太粗心了,没注意到
还有就是你这个手机端叫啥
另外,9楼版主大佬写的那个应该看看(虽然好多看不懂),尤其是delete[]这个,确实很多时候会忘


回复1我有好几个你要哪个,图片上的叫C4droid 支持c++14标准库,前期学基础反正我不用电脑学习,
回复2九楼大佬的代码正在看呢,今天看来又要多查查了
疑问,为啥你第六章才有if语句,然后我百度查了你的目录,额→_→你的那一本书是给鬼才看的吗?像while  dowhile居然在for循环后面讲if也是,我感觉for完全可以替代while和do while

[此贴子已经被作者于2020-1-17 12:41编辑过]

#13
gzy4442020-01-17 14:01
回复 12楼 叶纤
我网上查学C++用啥书的时候,有不少人都说C++ primer所以就买来看喽,至于顺序什么的能学会就行了呗2333
#14
叶纤2020-01-17 14:21
回复 13楼 gzy444
我学习的途径是论坛  >>大佬的代码>>百度>>视频>>书籍>>百度>>论坛>>然后疯狂敲代码,书籍看的最多的是代码大全
1