我开始学习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;
它应该要求用户写一个字符,然后检查它是否不是数字(第一个数组) - 工作正常。 然后第二个应该将小写改为大写,但在这里值不正确。我没有指针编写这个代码,它运行正常。 有人可以帮忙吗?
答案 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];
这样它就可以为稍后使用的数组创建另一个内存段。