第二个数组中的值错误 - 指针

时间:2018-02-09 22:15:42

标签: c++ pointers

我开始学习C ++,我发现指针存在一些问题。我不确定我错了什么

char *tablica = NULL;
char *ps;
char c;
int i;

cin >> c;

for (i = 0; c != '@'; cin >> c){
    if (!(isdigit(c))){
        ps = new char[i + 1];
        tablica = ps;
        tablica[i] = c;
        cout << tablica[i] << " na i " << i << endl;
        i++;
        delete ps;
    }
}

for (int n = 0; n < i; n++){
    if (islower(tablica[n]))
        cout << char(toupper(tablica[n])) << endl;
    else if (isupper(tablica[n]))
        cout << char(tolower(tablica[n])) << endl;
    else
        cout << tablica[n] << endl;
}

delete [] tablica;

它应该要求用户写一个字符,然后检查它是否不是数字(第一个数组) - 工作正常。 然后第二个应该将小写改为大写,但在这里值不正确。我没有指针编写这个代码,它运行正常。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

当您执行$ $$$ a$a abab$abab ab$ba$ab$ba aba$abaa bbbaaa$aaabbb aabb$bba aba$aba 时,您会sql klrice/klrice SQLcl: Release 18.1 Production on Fri Feb 09 12:10:04 2018 SQL> set sqlformat insert SQL> select * from emp; REM INSERTING into EMP SET DEFINE OFF; Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7839,'KING','PRESIDENT',null,to_timestamp('17-NOV-81','DD-MON-RR HH.MI.SSXFF AM'),5000,null,10); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7698,'BLAKE','MANAGER',7839,to_timestamp('01-MAY-81','DD-MON-RR HH.MI.SSXFF AM'),2850,null,30); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7782,'CLARK','MANAGER',7839,to_timestamp('09-JUN-81','DD-MON-RR HH.MI.SSXFF AM'),2450,null,10); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_timestamp('02-APR-81','DD-MON-RR HH.MI.SSXFF AM'),2975,null,20); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7788,'SCOTT','ANALYST',7566,to_timestamp('19-APR-87','DD-MON-RR HH.MI.SSXFF AM'),3000,null,20); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7902,'FORD','ANALYST',7566,to_timestamp('03-DEC-81','DD-MON-RR HH.MI.SSXFF AM'),3000,null,20); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_timestamp('17-DEC-80','DD-MON-RR HH.MI.SSXFF AM'),800,null,20); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,'ALLEN','SALESMAN',7698,to_timestamp('20-FEB-81','DD-MON-RR HH.MI.SSXFF AM'),1600,300,30); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,'WARD','SALESMAN',7698,to_timestamp('22-FEB-81','DD-MON-RR HH.MI.SSXFF AM'),1250,500,30); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7654,'MARTIN','SALESMAN',7698,to_timestamp('28-SEP-81','DD-MON-RR HH.MI.SSXFF AM'),1250,1400,30); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7844,'TURNER','SALESMAN',7698,to_timestamp('08-SEP-81','DD-MON-RR HH.MI.SSXFF AM'),1500,0,30); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7876,'ADAMS','CLERK',7788,to_timestamp('23-MAY-87','DD-MON-RR HH.MI.SSXFF AM'),1100,null,20); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7900,'JAMES','CLERK',7698,to_timestamp('03-DEC-81','DD-MON-RR HH.MI.SSXFF AM'),950,null,30); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7934,'MILLER','CLERK',7782,to_timestamp('23-JAN-82','DD-MON-RR HH.MI.SSXFF AM'),1300,null,10); 14 rows selected. SQL> 指向您分配的内存。

当您执行ps = new char[i + 1]时,您将ps指向指向同一个内存。您不会复制tablica = ps指向的实际内存,只会复制指针tablica

这意味着当你下次迭代再次分配内存时,你读取并存储到ps(和ps)所指向的内存中的内容就会消失。

在第二个循环中,tablica指向的内存不再存在,因为上一个循环中的最后一个ps(这本身就是一个错误,因为它应该是{{} 1}})。您尝试取消引用不再由您的程序拥有的内存。

除非您的练习是学习指针,否则请改用std::vector

答案 1 :(得分:0)

您正在删除tablica指针所引用的内存对象。

而不是做

tablica = ps;

使用

tablica = new char[i+1];

这样它就可以为稍后使用的数组创建另一个内存段。