C++
ICPCの過去問です。
問題文:http://www.deqnotes.net/acmicpc/p0003/ja
過去問を解いたのですが実行が上手くいかずに困っています。
私の書いたソースコード:
#include <iostream>
#include <string>
using namespace std;
class Line{
public:
char* Read(){
char number[1024];//数字を入れる配列
static char sentence[76];//できあがった文字列を入れる配列
char word;//現在の文字
int i=0;//カウンタ
int s=0;//sentenceのカウンタ
int y=0;//数字が何回連続したかを数える
char one[5]={'.',',','!','?',' '};
char two[3]={'a','b','c'};
char three[3]={'d','e','f'};
char four[3]={'g','h','i'};
char five[3]={'j','k','l'};
char six[3]={'m','n','o'};
char seven[4]={'p','q','r','s'};
char eight[3]={'t','u','v'};
char nine[4]={'w','x','y','z'};
int c;
while(c = getchar() != '\n'){//数を一文字ずつ配列にいれていく
number[i] = c;
i++;
}
for(int x=0;x<(i+1);x++){
if(number[x]=='0'){
if(word == 'N'){}
else{sentence[s]=word;s++;y=0;word='N';}
}
else{
if(number[x]=='1'){
word=one[y];
y++;
y=y%5;}
else if(number[x]=='2'){
word=two[y];
y++;
y=y%3;}
else if(number[x]=='3'){
word=three[y];
y++;
y=y%3;
}
else if(number[x]=='4'){
word=four[y];
y++;
y=y%3;
}
else if(number[x]=='5'){
word=five[y];
y++;
y=y%3;
}
else if(number[x]=='6'){
word=six[y];
y++;
y=y%3;
}
else if(number[x]=='7'){
word=seven[y];
y++;
y=y%4;
}
else if(number[x]=='8'){
word=eight[y];
y++;
y=y%3;
}
else{
word=nine[y];
y++;
y=y%4;
}
}
}
sentence[i]='N';
return sentence;//配列の先頭のポインタを返す
}
};
int main(){
int n;//行数
cin>>n;
getchar();//改行をとる
char *first[n];
int i;
int x=0;
char ch;
char *Fir;
for(i=0;i<n;i++){
Line line;
first[i] = line.Read();
}
for(int j=0;j<i;j++){
Fir = first[i];
while((ch = Fir[x]) != 'N'){
cout << ch ;
x++;
}
cout << '\n';
}
return 0;
}
実行結果:
1
20
Segmentation fault
となってしまいます。
coutやコメントアウトで動きを追ってみたところ、下から8行目くらいのwhile文がなければ、segumentation faultはおきませんでした。ポインタの扱いが間違っているのかなとは思うのですが、どこが悪いのか考えても分かりません。どなたか教えてください。