代码中的小问题,大家帮帮忙

sj307639429 2009-03-04 04:44:44
/*输入n串字符,每串包括字符'-','A'到'P','R'到'Y' 和'0'到'9',以下代码用于简化所输入的字符串,
1.将字母映射到数字,对应关系如下:
A, B, 和C 映射到 2
D, E, 和F 映射到 3
G, H, 和I 映射到 4
J, K, 和L 映射到 5
M, N, 和O 映射到 6
P, R, 和S 映射到 7
T, U, 和V 映射到 8
W, X, 和Y 映射到 9 ;
2.去掉所含的'-';
3.输出,删除重复的字符串,并按顺序输出,输出的格式为"xxx-xxxx",其中'x'代表数字;
*/
//代码如下,运行时遇到了内存出错的问题,找了半天没找到,请教高手们了
#include <iostream>
#include "stdlib.h"
using namespace std;
void init(char **tell,int n){ //动态开辟,并初始化
tell=new char*[n];
for(int i=0;i<n;i++){
tell[i]=new char[15];
}
for(int i=0;i<n;i++){
cin>>tell[i];
}

}

void jianhua(char **tell,int n,const int m){
int k=0;
for(int i=0;i<n;i++){ //算法为"黑白逆"
for(int j=0;j<m;j++){

if(tell[i][j]=='-'){
if(tell[i][j+1]!='-'){
tell[i][k]=tell[i][j+1];
tell[i][j+1]='-';
k++;

}

} //如果找到'-',则将'-'后的非'-'字符赋给'-'所在的位置后其值为'-'
else k++;



}
}




for(int i=0;i<n;i++){
tell[i][8]='\0';
}

for(int i=0;i<n;i++){
cout<<tell[i]<<endl;
}

for(int i=0;i<n;i++){
for(int j=0;j<8;j++){
switch(tell[i][j]){
case'1':tell[i][j]='1';break; //映射
case'A':
case'B':
case'C':
case'2':tell[i][j]='2';break;
case'D':
case'E':
case'F':
case'3':tell[i][j]='3';break;
case'G':
case'H':
case'I':
case'4':tell[i][j]='4';break;
case'J':
case'K':
case'L':
case'5':tell[i][j]='5';break;
case'M':
case'N':
case'O':
case'6':tell[i][j]='6';break;
case'P':
case'R':
case'S':
case'7':tell[i][j]='7';break;
case'T':
case'U':
case'V':
case'8':tell[i][j]='8';break;
case'W':
case'X':
case'Y':
case'9':tell[i][j]='9';break;
case'0':tell[i][j]='0';break;
case'-':break;
case'\0':break;

default:cout<<"your iuput is wrong"<<endl;
}
}
}
}

void sort(char** tell,int n,int m){//排序
char *temp;

int i,j,k;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++){
if(strcmp(tell[k],tell[j])>0)k=j;
if(k!=i){
temp=tell[i];
tell[i]=tell[k];
tell[k]=temp;
}
}
}
}

int* delrepate(char **tell,int n){//删除重复字符串
int *temp;
temp=new int[n];
for(int i=0;i<n;i++){
temp[i]=-1;
}
int k=0,q=0; //k用来记录遍历到的字符串,q用来记录删除字符串的个数
for(int i=0;i<n-1-q;i++){
k=i;
for(int j=i+1;j<n-q;j++){
if(strcmp(tell[i],tell[j])==0){
temp[k]++;
q++;
for(int p=k+1;p<=n-q;p++){
tell[p]=tell[p+1];

}
tell[n-q]="\0";//删除一次后表长减1,n-q后的空间是否要释放
j--;
if(j>n-q)break;
}
else temp[k]=0;//temp[k]==o表示没有与tell[k]重复的字符串,==-1表示遍历至此结束
}
}
return temp;
}

int main(){
char**tell;
int n,*p;
int i=0,m=15;
cin>>n;
init(tell,n);
jianhua(tell,n,m);
sort(tell,n,m);
p=delrepate(tell,n);
while(*(p+i)!='-1'){
for(int j=0;j<9;j++){
if(j<3)cout<<tell[i][j];
else if(j==3)cout<<'-';
cout<<tell[i][j-1];
}
if(*(p+i)>0)cout<<" "<<*(p+i)<<endl;
else cout<<endl;
i++;
}
return 0;
}










...全文
90 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sj307639429 2009-03-04
  • 打赏
  • 举报
回复
自己顶下
sj307639429 2009-03-04
  • 打赏
  • 举报
回复
但程序仍然报错,大家在帮我看下啊
sj307639429 2009-03-04
  • 打赏
  • 举报
回复
3楼说的错误我已更正,代码如下:


int k=0;
int *a=new int[n];
for(int i=0;i<n;i++){
a[i]=0;
}
for(int i=0;i<n;i++){ //算法为"黑白逆"
for(int j=0;j<m;j++){

if(tell[i][j]=='-'){
if(tell[i][j+1]!='-'){
tell[i][a[i]]=tell[i][j+1];
tell[i][j+1]='-';
a[i]++;

}

} //如果找到'-',则将'-'后的非'-'字符赋给'-'所在的位置后其值为'-'
else a[i]++;



}
}



ysysbaobei 2009-03-04
  • 打赏
  • 举报
回复
Qlaiaqu 2009-03-04
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <iostream>
#include "stdlib.h"

using namespace std;

void init(char **tell,int n){ //动态开辟,并初始化
tell=new char*[n];
for(int i=0;i <n;i++){
tell[i]=new char[15];
}
for(int i=0;i <n;i++){
cin>>tell[i];
}
}

void jianhua(char **tell,int n,const int m){
int k=0;
for(int i=0;i <n;i++){ //算法为"黑白逆"
for(int j=0;j <m;j++)
{
if(tell[i][j]=='-')
{
if(tell[i][j+1]!='-')
{
tell[i][k]=tell[i][j+1];
tell[i][j+1]='-';
k++;
}
} //如果找到'-',则将'-'后的非'-'字符赋给'-'所在的位置后其值为'-'
else k++; /////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////此处k会增加到i*j,所以越界访问,自然失败,其它地方没看了
}
}

for(int i=0;i <n;i++){
tell[i][8]='\0';
}

for(int i=0;i <n;i++){
cout <<tell[i] <<endl;
}

for(int i=0;i <n;i++){
for(int j=0;j <8;j++){
switch(tell[i][j]){
case'1':tell[i][j]='1';break; //映射
case'A':
case'B':
case'C':
case'2':tell[i][j]='2';break;
case'D':
case'E':
case'F':
case'3':tell[i][j]='3';break;
case'G':
case'H':
case'I':
case'4':tell[i][j]='4';break;
case'J':
case'K':
case'L':
case'5':tell[i][j]='5';break;
case'M':
case'N':
case'O':
case'6':tell[i][j]='6';break;
case'P':
case'R':
case'S':
case'7':tell[i][j]='7';break;
case'T':
case'U':
case'V':
case'8':tell[i][j]='8';break;
case'W':
case'X':
case'Y':
case'9':tell[i][j]='9';break;
case'0':tell[i][j]='0';break;
case'-':break;
case'\0':break;

default:cout <<"your iuput is wrong" <<endl;
}
}
}
}

void sort(char** tell,int n,int m){//排序
char *temp;

int i,j,k;
for(i=0;i <n-1;i++){
k=i;
for(j=i+1;j <n;j++){
if(strcmp(tell[k],tell[j])>0)k=j;
if(k!=i){
temp=tell[i];
tell[i]=tell[k];
tell[k]=temp;
}
}
}
}

int* delrepate(char **tell,int n){//删除重复字符串
int *temp;
temp=new int[n];
for(int i=0;i <n;i++){
temp[i]=-1;
}
int k=0,q=0; //k用来记录遍历到的字符串,q用来记录删除字符串的个数
for(int i=0;i <n-1-q;i++){
k=i;
for(int j=i+1;j <n-q;j++){
if(strcmp(tell[i],tell[j])==0){
temp[k]++;
q++;
for(int p=k+1;p <=n-q;p++){
tell[p]=tell[p+1];

}
tell[n-q]="\0";//删除一次后表长减1,n-q后的空间是否要释放
j--;
if(j>n-q)break;
}
else temp[k]=0;//temp[k]==o表示没有与tell[k]重复的字符串,==-1表示遍历至此结束
}
}
return temp;
}

int main(){
char**tell;
int n,*p;
int i=0,m=15;
cin>>n;
init(tell,n);
jianhua(tell,n,m);
sort(tell,n,m);
p=delrepate(tell,n);
while(*(p+i)!='-1'){
for(int j=0;j <9;j++){
if(j <3)cout <<tell[i][j];
else if(j==3)cout <<'-';
cout <<tell[i][j-1];
}
if(*(p+i)>0)cout <<" " <<*(p+i) <<endl;
else cout <<endl;
i++;
}
return 0;
}
  • 打赏
  • 举报
回复
1.将字母映射到数字,对应关系如下:
A, B, 和C 映射到 2
D, E, 和F 映射到 3
G, H, 和I 映射到 4
J, K, 和L 映射到 5
M, N, 和O 映射到 6
P, R, 和S 映射到 7
T, U, 和V 映射到 8
W, X, 和Y 映射到 9 ;
这么类干吗,switch呗.
或者让A-num=6,则
(ch-num)/3就可以映射了.
xtting_8984313 2009-03-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 sj307639429 的帖子:]
/*输入n串字符,每串包括字符'-','A'到'P','R'到'Y' 和'0'到'9',以下代码用于简化所输入的字符串,
1.将字母映射到数字,对应关系如下:
A, B, 和C 映射到 2
D, E, 和F 映射到 3
G, H, 和I 映射到 4
J, K, 和L 映射到 5
M, N, 和O 映射到 6
P, R, 和S 映射到 7
T, U, 和V 映射到 8
W, X, 和Y 映射到 9 ;
2.去掉所含的'-';
3.输出,删除重复的字符串,并按顺序输出,输出的格式为"xxx-xxxx",其中'x'代表数字;
*…
[/Quote]


如果是ASCII:
char temp=xxxx;
(temp-A)/3 + 2;就是结果

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧