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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

1563閲覧

C言語 文字列を表示する簡単な関数(初心者)

roun

総合スコア10

C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/09/17 13:11

初心者です。「明解C言語 入門編」という本の「演習11-1」がうまくできません。

###やりたいこと「演習11-1」

下記に示した関数put_stringと同じ動作をする関数を、添字演算子を使わずに作成せよ。
void put_string(const char str[])
{
unsigned i = 0;

while (str[i]) putchar(str[i++]);

}

###発生している問題・エラーメッセージ
自分でコードを考えて書いてみたのですが、うまく表示できないうえ、フリーズします。

イメージ説明
###該当のソースコード

#include <stdio.h> void put_string(const char *s) { while (*s++) { putchar(*s); }; } int main(void) { char str[100]; printf("文字列を入力してください;"); scanf_s("%s", str); put_string(str); return 0; }

###試したこと
まだ初心者のため、ポインタや配列など分からないことだらけなので、皆さんの力を貸してほしいです。

###補足情報(言語/FW/ツール等のバージョンなど)
使用しているソフトはvisual stdioです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

scanf_s()での文字列読み込みはサイズ指定が必要です。
scanf_s("%s", str, 100);としましょうd^^; ソースを見る限りsizeof(str)でもいけると思うんですが参考になるサイトが見つからない^^;
参考:scanf_sの落とし穴

投稿2017/09/17 14:02

cateye

総合スコア6851

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

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

roun

2017/09/17 14:07

できました!サイズ指定なんて全く知りませんでした。 ありがとうございました。
guest

0

お題のプログラムと ++ を使うタイミングが変わってますね.それが原因。
putchatrに渡している*sは whileでチェックしたsの一つ先ですよ。++してますからね。

投稿2017/09/17 13:19

a_saitoh

総合スコア702

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

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

roun

2017/09/17 13:25

void put_string(const char *s) { while (*s) { putchar(*s++); }; } にするということでしょうか?
a_saitoh

2017/09/17 13:39

それでいけるはず。 ・・・ごめんなさい。putc()がマクロであるような処理系が今でもあるのを忘れてました。 putchar(*s); *s++; にしてください。 あと、}のあとの;は不要。あっても空文があることになるだけなのでコンパイルは通りますが。書かない癖をつけておいたほうがいいです。
roun

2017/09/17 13:50

void put_string(const char *s) { while (*s) { putchar(*s); *s++; } } にしても結果は同じでした。何をどうすればよいのでしょうか?
a_saitoh

2017/09/17 14:43

put_string()はこれでいいです(手元のコンパイラで動作確認しました)。メインルーチン側にも問題がありましたね。別の人が回答済み。
rubato6809

2017/09/17 22:19

重箱の隅のようではありますが、 *s++; は s++; とすべきです。 「*」をつける必要はありません。動作はするけど * を付ければ間違いの部類に入るでしょう。 ここでやりたいことは、ポインタ変数 s が次の文字を指すように、 s をインクリメントすることだから。言い変えると、ここの一行で操作したいのはポインタ変数 s の値であって、s が指している文字ではありません。
a_saitoh

2017/09/18 02:32

あ、コピペしたときに削り忘れました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問