質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

3回答

3025閲覧

C言語 ポインタの再初期化について

azurail0

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2016/12/26 02:28

編集2016/12/26 02:57

###while文の中ですすんだ分だけポインタを戻したい
C言語で
5
a 70 78 82 57 74
d 68 81 81 60 78
e 63 76 55 80 75
j 90 100 96 10 10
o 88 78 81 97 93
という入力に対して
a 70 78 82 57 74
d 68 81 81 60 78
e 63 76 55 80 75
j 90 100 96 10 10
o 88 78 81 97 93
という出力をするプログラムを作っています。
(型は、左から順に、char,int,int,int,int,int)

一行目の分はうまくできるのですが、それ以降はポインタの初期化がちゃんとできなくて、文字列の代入がうまくいっていません。

ポインタの使い方がおかしいとは思うのですが、どこがどうおかしいのかがまったく分かりません。

ご教示いただけるとうれしいです。よろしくお願いいたします。

###該当のソースコード

#include <stdio.h> #include<stdlib.h> int main(void){ int N=0; //1行目に入力された値を格納する変数 char t[1000]; char *pt=t; int e[1000],m[1000],s[1000],j[1000],g[1000]; int *pe=e,*pm=m,*ps=s,*pj=j,*pg=g; char str[1000]; char *pp=str; int flag=0; int i=0; char s1[100],s2[100],s3[100],s4[100],s5[100]; char *p1=s1,*p2=s2,*p3=s3,*p4=s4,*p5=s5; //1行目の数字の格納 fgets(str, sizeof(str), stdin); N=atoi(str); //二行目以降の文字列を格納していく for(i=0;i<N;i++){ //pp=str; fgets(str, sizeof(str), stdin); printf("%s",str); while(*pp){ if(*pp==' '){ flag++; pp++; }else if(flag==0){ *pt++=*pp++; }else if(flag==1){ *p1++=*pp++; *p1='\0'; }else if(flag==2){ *p2++=*pp++; *p2='\0'; }else if(flag==3){ *p3++=*pp++; *p3='\0'; }else if(flag==4){ *p4++=*pp++; *p4='\0'; }else if(flag==5){ *p5++=*pp++; *p5='\0'; } } *pe=atoi(s1);*pm=atoi(s2);*ps=atoi(s3);*pj=atoi(s4);*pg=atoi(s5); printf("%c ",t[0]); printf("%d %d %d %d %d\n",*pe,*pm,*ps,*pj,*pg); pt++;pe++;pm++;ps++;pj++;pg++; } return 0; }

###試したこと
while文で、ポインタppのアドレスが変わっているため、pp=strで再初期化しようとしたが、うまくいかなかった。
進んだ分だけカウントして、そのぶんpp--を繰り返す。ということも試したがうまくいかなかった。

###補足情報(言語/FW/ツール等のバージョンなど)
C言語

###追記
別のエラーがでてきたため、プログラムは完成していませんが、自分で試行錯誤できる余地が有り、質問内容がかなり変わってくることが予想されるので、ベストアンサーを決定いたしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

解決済ですが

c

1#include <stdio.h> 2#include<stdlib.h> 3int main(void){ 4 int N=0; //1行目に入力された値を格納する変数 5 char t[1000]={0}; 6 char *pt=t; 7 int e[1000],m[1000],s[1000],j[1000],g[1000]; 8 int *pe=e,*pm=m,*ps=s,*pj=j,*pg=g; 9 int ct,ce,cm,cs,cj,cg; 10 char str[1000]; 11 char *pp=str; 12 int flag=0; 13 int i=0; 14 char s1[100],s2[100],s3[100],s4[100],s5[100]; 15 char *p1=s1,*p2=s2,*p3=s3,*p4=s4,*p5=s5; 16 17 //1行目の数字の格納 18 fgets(str, sizeof(str), stdin); 19 N=atoi(str); 20 //二行目以降の文字列を格納していく 21 for(i=0;i<N;i++){ 22 23 fgets(str, sizeof(str), stdin); 24 pp=str; 25 flag=ct=ce=cm=cs=cj=cg=0; 26 27 while(*pp!='\n'){ 28 29 if(*pp==' '){ 30 flag++; 31 pp++; 32 }else if(flag==0){ 33 *pt++=*pp++; 34 ct++; 35 }else if(flag==1){ 36 *p1++=*pp++; 37 *p1='\0'; 38 ce++; 39 }else if(flag==2){ 40 *p2++=*pp++; 41 *p2='\0'; 42 cm++; 43 }else if(flag==3){ 44 *p3++=*pp++; 45 *p3='\0'; 46 cs++; 47 }else if(flag==4){ 48 *p4++=*pp++; 49 *p4='\0'; 50 cj++; 51 }else if(flag==5){ 52 *p5++=*pp++; 53 *p5='\0'; 54 cg++; 55 } 56 57 } 58 59 *pe=atoi(p1-ce); 60 *pm=atoi(p2-cm); 61 *ps=atoi(p3-cs); 62 *pj=atoi(p4-cj); 63 *pg=atoi(p5-cg); 64 65 printf("%c ",*(pt-ct)); 66 printf("%d %d %d %d %d\n",*pe,*pm,*ps,*pj,*pg); 67 pt++;pe++;pm++;ps++;pj++;pg++; 68 } 69 return 0; 70}

投稿2016/12/26 03:46

編集2016/12/26 04:13
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azurail0

2016/12/26 06:39

今回もご回答ありがとうございます。 値の代入で進んだポインタを調整するために、ct,ce,cm,cs,cj,cgなどを使うんですね。 初期化をしただけではうまくいかず、手間取っていたので、とても参考になりました。 ポインタを使うときにはどこがどう動いているかをもっと意識しようと思います。 ありがとうございました。
guest

0

こんにちは。

ほとんどの変数は1行処理する度に初期化する必要があると思いますよ。
このような時は、forループの外ではなく、中で初期化しましょう。

forの{}内で各作業用のポインタp?等を宣言するのも手です。
そのようにすればその変数が必要とされる間のみその変数が有効なので、可読性/メンテナンス性が上がります。

投稿2016/12/26 03:00

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azurail0

2016/12/26 04:06

ご回答有難うございます。 こういったプログラムを作るときはfor文の中で宣言をするといいんですね。 その方法は初めて聞いたので、とても参考になります。 ありがとうございました。
guest

0

ベストアンサー

詳しくは見ていませんが、flagは1行処理するたびに0に初期化する必要がありそうです。
ppもインクリメントしているので、同様に初期化する必要がありますね。
pttの必要性もよくわかりません。

あと1行に処理を詰め込むことはお勧めしません。
可読性が悪くなり、問題の発見が遅くなるだけです。

投稿2016/12/26 02:40

編集2016/12/26 02:44
ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azurail0

2016/12/26 02:54

ご解答有難うございます。 flagの部分に気付かず、試行錯誤していました。 また、プログラムの書き方についてもアドバイスいただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問