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

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

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

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

Q&A

解決済

1回答

1346閲覧

このプログラムの内容が分からないので、教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/11/10 09:49

編集2017/11/10 10:31

住所録のプログラムに以下のプログラムがあってvoid chopが何をしているのかわかりません。実行結果は下にのせています。不足している情報がありましたら、教えてください。

コード #include <stdio.h> #include <string.h> void chop(char *p) { for (; *p; p++) ; p--; while (*p == '\r' || *p == '\n') *(p--) = 0; } void chop2(char *p) { int len = strlen(p); //\0は含まない for (int i = 0; i < len; i++) { if (p[i] == '\r' || p[i] == '\n') { p[i] = 0; } } } void dump(char * p, int len) { for (int i = 0; i < len; i++) { printf(" %02X", *p & 0xff); p++; } printf("\n"); } int main(int atgc, char** argv) { char str[10]; strcpy(str, "0\n"); printf("[%s]\n", str); chop(&str[2]); printf("[%s]\n", str); dump(str, sizeof(str)); printf("\n"); strcpy(str, "0\n"); printf("[%s]\n", str); chop2(&str[2]); printf("[%s]\n", str); dump(str, sizeof(str)); return 0; } // 実行結果 naka@naka ~ $ cd kadai/kad9-8 naka@naka ~/kadai/kad9-8 $ gcc -g void_chop.c naka@naka ~/kadai/kad9-8 $ a.exe [0 ] [0] 30 00 00 50 37 00 80 00 40 00 [0 ] [0 ] 30 0A 00 50 37 00 80 00 40 00 naka@naka ~/kadai/kad9-8 $

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

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

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

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

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

KSwordOfHaste

2017/11/10 10:15

コードタグの内側に置くのはコードだけにし、質問文そのもの(自然言語の部分)はコードタグの外側に置くようにしてください。コードタグの内側だと長い行の折り曲げがされないため横スクロールしないと文章が読めないのです。
退会済みユーザー

退会済みユーザー

2017/11/10 10:30

よく指摘されます。なかなかよく質問文をどこに書けばいいか初心者にはわかりにくいです。わたしもそうしたいと思ってメールで問い合わせたりしているんですが、具体的に質問コーナーでおしえていただければありがたいのですが。
退会済みユーザー

退会済みユーザー

2017/11/10 10:48

こんばんわ、いつもありがとうございます。これで質問で怒られなくなるとおもいます。9章の課題も最後の自由課題9-8に来ました。以前集めた住所録のプログラムを読んでいます。またひっかっかたら、おねがいいたします。仕事に行ってきます。
guest

回答1

0

ベストアンサー

文字列として扱う char* のエリアに対して、
「最後に \r,\n で続いている部分があったら、それを取り除く」

つまり、改行コードを取り除くことをやっています。

通常、C で標準入力から1行取得するようなことをすると、改行コードも含めて取得します。
そのままだと文字列処理に都合が悪いので、改行コードを取り除いているのです。

投稿2017/11/10 09:55

tacsheaven

総合スコア13703

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

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

退会済みユーザー

退会済みユーザー

2017/11/10 10:39

ありがとうございます。恥ずかしい話ですが、void chopのfor (; *p; p++) ; p--; のところが分からないので、教えていただけませんか。 for文の初期値が ; でいつもわからなくなるんですが。p--;はfor文の外ですよね。お願いいたします。
cateye

2017/11/10 14:31 編集

for (; *p; p++)で文字列の終端('\0')が見つかるまでポインタを進めます。 ループを抜けるとポインタは'\0'を指しているはずです。なので、ポインタを1文字戻します (p--;)。その後、while (*p == '\r' || *p == '\n')で改行が見つかったらクリア('\0'で埋める)する*(p--) = 0;改行がある限り文字列の終端を先頭方向に後退させている。・・・で解りますかね?
tacsheaven

2017/11/11 01:10

for( 式1; 式2; 式3 ) は、for ループの前に式1を行い(初期化)、式2 の条件が成立している間、forループ内の処理をして、最後に式3を行います。式1が空ということは、初期化の必要が無いということです。関数の引数として *p を受け取っていますから、改めて初期化する必要はありません。 式2は *p だけですが、この結果が 0 になれば条件不成立に成ります。つまり *p の示す先が 0、すなわち null になったら条件不成立です。なのでこのループは、*p が null を指し示すまで、p の位置をずらしていくとなります。結果的に文字列の終端を探しているのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問