文字列のコピー
Posted: 2012年7月02日(月) 22:19
はじめまして、C言語初心者です。
さっそくですが本題に移らせていただきます。
学校の課題なのですが、よろしくお願いします。
問)getlineで文字配列lineに読み込んだ文字列をmemに詰め込んみ最後に詰め込んだmemを表示せよ。(\0の部分は_で未使用部分は*を表示する)
例)初めに「gohann」次に「pann」と入力して終わらせると……
↓結果例↓
gohann[6]追加
gohann_************
pann[4]追加
gohann_pann_********
^Z
データ数=4
↑ここまで↑
ただしmemに詰め込める文字数を超えてしまったら-1を返す
例)先ほどの「pann」の後に「misoshiru」を入力
↓結果例↓
pann[4]追加
gohann_pann_********
misoshiru[9]追加
gohann_pann_********
データ数=-1
↑ここまで↑
これに対して僕が書いたのが以下の通りです。
しかしこれではmemに詰め込めず、さらに文字数が超えてしまってもー1が戻らずに止まってしまいます。
どのようにすればいいでしょうか、アドバイスお願いします。
さっそくですが本題に移らせていただきます。
学校の課題なのですが、よろしくお願いします。
問)getlineで文字配列lineに読み込んだ文字列をmemに詰め込んみ最後に詰め込んだmemを表示せよ。(\0の部分は_で未使用部分は*を表示する)
例)初めに「gohann」次に「pann」と入力して終わらせると……
↓結果例↓
gohann[6]追加
gohann_************
pann[4]追加
gohann_pann_********
^Z
データ数=4
↑ここまで↑
ただしmemに詰め込める文字数を超えてしまったら-1を返す
例)先ほどの「pann」の後に「misoshiru」を入力
↓結果例↓
pann[4]追加
gohann_pann_********
misoshiru[9]追加
gohann_pann_********
データ数=-1
↑ここまで↑
これに対して僕が書いたのが以下の通りです。
#include <stdio.h>
#define MMAX 20 //memの要素数
#define MAXLEN 20 //lineの要素数
//外部変数
char mem[MMAX];
char *mp=mem;
//関数宣言
int pushst (void);
int getline (char s[], int lim);
int delspace(char line[], int len);
int copy(char p, char line[]);
char *getmem(int len);
void printmem(char mem[]);
void main(void)
{
//宣言
int nd=0;
nd=pushst(); //関数呼び出し
//結果を表示
printf("データ数=%d\n",nd);
}
//関数定義
int getline(char s[], int lim)
{
int c,i,n;
for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
{
s[i]=c;
}
if(c=='\n')
{
s[i]='\n';
++i;
}
s[i]='\0';
for(n=0; n<i; ++n)
{
mem[n]=s[n];
}
return i;
}
int delspace(char line[], int len)
{
int i=0,n;
while(line[i]!=' ' && line[i]!='\n' && line[i]!='\t')
{
++i;
}
line[i]='\0';
for(n=0; n<i; ++n)
{
printf("%c",line[n]);
}
printf("[%d]追加\n",n);
return i;
}
char *getmem(int len)
{
*mp+=len;
if((*mp-*mem)<=MMAX)
{
return mp-len;
}
else
{
return NULL;
}
}
int copy(char p, char line[])
{
int i;
for(i=0; i<=p; ++i)
{
mem[p+i]=line[i];
}
return 0;
}
void printmem(char mem[])
{
int i;
for(i=0; i<MMAX; ++i)
{
if('a'<=mem[i] && mem[i]<='z')
{
putchar(mem[i]);
}
else if(mem[i]=='\0')
{
putchar('*');
}
else
{
putchar('_');
}
}
printf("\n\n");
}
int pushst(void)
{
char line[MAXLEN]={0};
char *p=0;
int len;
int n=0;
while(1)
{
len=getline(line,MAXLEN);
if(len==0)
{
return n;
}
len=delspace(line,len);
p=getmem(len+1);
if(p!=NULL)
{
copy(*p,line);
}
else
{
return -1;
}
printmem(mem);
++n;
}
return n;
}
どのようにすればいいでしょうか、アドバイスお願いします。