Try   HackMD

情報処理実習 第10回 質問回答ページ

リンク

  • [webEx]

質問&回答について

個別で来る質問・コメント等には答えることが出来ず,
授業時間内の質問フォームを通して質問・回答を行うという形式で統一されました.
(授業時間外の質問は,次回の授業時間内に質問フォームを通してお願いします)

授業時間ギリギリの質問に気づかないことがあります.
我々が質問に気づいていないと思われる場合は,
次回の授業時間中に再度質問を投稿してください.

質問内容に必ず書くこと

質問の際は,必ず下の4点を書いてください.

  • どの課題に関する質問か
  • わかっていること
  • 試してこと
  • そのうえでわからないこと

「どうしたらいいか?」という質問に答えることは出来ません.
自身で原因を探って意図通りに動くようにするのが実習内容です.

殆どのエラーはググれば説明が出てきます.
わからないことが起きた時はGoogle等で検索することを推奨します.

質問の内容によっては,「もう少し自力で考えてほしい(教科書・配布資料をよく読んでほしい,試行錯誤しながら自分のコードを触ってほしい)」「回答を控える」マークを回答状況ページにつける場合があります.

「質問番号n」の形で見出しをつけます.
基本的には新しい回答ほど上位に表示されます.
回答状況ページで回答状況を確認後,
Ctrl+F,Cmd+Fで自分の質問番号をページ内検索してください.
ただし,回答状況のH列は「回答書き込み完了」ではなく「今から回答を行います」の印です.

質問量に依っては「重複した質問」欄の更新が止まる場合があります.
そのため,重複した質問は回答の場所を検索出来ないことがあります.
また,質問する前に必ずこのページを見て,類似の質問がないことを確認してからGoogleフォームで質問を投稿してください.

質問と回答の例は以下の通りです.

質問番号0

hogeがhogehogeの場合,hogehogehogeはhogeですか?

#include <stdio.h>

int main(void) {
  printf("Hello World\n");
  return 0;
}

XXXがYYYなのでZZZをAAAするとBBBがCCCです.
重複した質問:質問番号i, 質問番号j,質問番号k


質問番号8

入力した文字列を1文字ずつ判定するにはどのようにすれば良いのでしょうか?

文字列は配列であることを思い出してください。配列へのアクセス方法と同じです。
考察にかいていただいているアイデアは間違ってはいないと思います。

質問番号7

for文の中で配列を3つ形成する方法がわからない

あなたの方法であればfor文を使わなくても実装出来るかと思います.
また,長さ0のchar型配列str1,str2,str3自体も今のコードで生成出来ています.

質問の意図が読み取れていません..
もし必要ならもう少し他の聞き方で質問をしてください.

また,質問内容とはおそらく無関係だと思うのですが,Warningは読みましたか?
Warningに以下のような警告が出ていて,

main.c:7:9: warning: 
      using the
      result of an
      assignment as
      a condition
      without
      parentheses
      [-Wparentheses]
    if(i=0){
       ~^~
use '==' to
      turn this
      assignment
      into an
      equality
      comparison

と言われています.

質問番号5

直接的なヒントや解決策そのものを答えることは出来ません.

ご自身のコードを見直してみてください.
全体のどの部分まで自身の意図どおりに動いているかを
適宜printf()文を挟むなどして確かめてください.
(各箇所での各変数の値は自身の意図通りか,for文,while文の挙動は自身の意図通りかなど..)

また,for文,while文,配列などの使い方が違う,という場合もあります.
教科書,過去資料をもう一度見返して,自身の意図どおりに使えているかを再確認してください.

類似の質問:質問番号6,質問番号9

質問番号4

getsを使うとwarningになってしまうのですがどうしたらいいのですか

main.c:8:5: warning: implicit declaration of function
      'gets' is invalid in C99
      [-Wimplicit-function-declaration]
    gets(str);
    ^
1 warning generated.
/tmp/main-59f523.o: In function `main':
main.c:(.text+0x57): warning: the `gets' function is dangerous and should not be used.
 ./main
文字列を入力してください

gets()関数を使う限り,Warningを消す方法はないです.

Warningの内容でGoogle検索していただくといくつか(英語だけでなく日本語でも)解説が出てくるかと思いますが,
gets()関数はオーバーフローを起こす可能性がある(getsに渡した配列の長さより長い文字数の文字列をgets()が受け取ってしまう,より正しく言うと「gets()は,受け取る文字列の長さの上限を設定することが出来ない」)ため,最近はgets()を使うことは非推奨となっているそうです.

最近はgets()ではなくfgets()関数を使うことが推奨されているようですが,
教科書に沿ってgets()関数を使った例を取り上げているのだと思います(回答者は担当者ではありません).

もしもより正確な解説に興味があれば,ご自身でも近年のgets()関数の取り扱いについて調べてみてください..
(また,エラー文,警告文が出た時,まずはGoogle検索することをオススメします)

質問番号3

文字列の長さが同率一位があった場合どうしますか?

どちらでも良いです。一応、どのように決めたかをレポートに記してください。

質問番号2

gets関数を使用するとerrorになってしまいます。どうすればgets関数をerrorなしで使うことができますか?

初期化部分を見直してください。
(追記:失礼しました、こちらはerrorではなく、警告(warning)ですね。質問番号4の回答を読んでください。)

質問番号1

講義資料の[文字列の基礎]と[文字列の入出力]のプログラム部分において、最後のreturn値が異なりますが、これは意味を持ちますか?

(回答者は今週の担当者ではありませんので,暫定的(?)な回答です)
今回の場合はおそらく特に意味はないと思います.

プログラムが正常に終了した場合は0をreturn し,
正常に終了しなかった場合は1をreturn するというのが暗黙の了解(通例?)ではありますが,
今回はreturnする値による意味の違いはないように見えます.

(補足説明等ありましたらよろしくお願いいたします >高澤先生
すぎのうち先生、その通りです、ご回答ありがとうございます。
基本的にはmain関数では0を書いておくのが良さそうです。