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

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

ただいまの
回答率

90.52%

  • プログラミング言語

    679questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

  • ビルド

    58questions

    ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

  • char

    28questions

    charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

microsoft visual c++

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 761

-tata

score 5

include "stdafx.h"

int main()
{
char str[100];
int num;
printf("文字列を入力してください。\n");
scanf_s("%s",str);
for(num=0;str[num]!='\0';num++)
{}
printf("文字数は%dです。\n", num);
return 0;
}

という、簡単な文字数を測るプログラミングをしました。
ですが、
'scanf_s': not enough arguments passed for format string.
と「引数が足りない」という、おそらくそういう意味の文が出てきます。
自分なりに引数というのを調べてみたのですが分かりません。
このプログラミングでどこを修正すれば良いかと、できれば引数とは何かを教えていただきたいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

こんにちは。

scanf_s()はscanf()と微妙にパラメータの与え方が異なります。
"%s"に対しては、バッファとバッファのサイズ(文字単位)を指定する必要が有ります。

scanf_s("%s",str, sizeof(str)/sizeof(str[0])); 

とすれば良い筈です。(実は使ったことはないので外していたらごめんなさい。)

sizeof(str)/sizeof(str[0])はちょっと冗長です。が「文字数」であることを強調するためにこのようにしてみました。
お使いのソースでは該当しませんが、1文字が2バイトのような場合もあるからです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/08 22:35

    提示されたMicorosoftのページではchar, whar_tともに_countofマクロの利用を例示していますね。
    (#include <stdlib.h>が必要ですが)

    キャンセル

  • 2017/03/08 23:01

    can110さん。
    おっと、本当ですね。見落としてました。フォローありがとうございます。

    -tataさん。
    can110さんの指摘通り、ソースの頭で#include <stdlib.h>しておいて、次のようにした方が良いです。

    scanf_s("%s",str, _countof(str));

    正規ドキュメントの推奨どおりに記述した方が無用なトラブルに巻き込まれにくいですから。

    キャンセル

  • 2017/03/09 13:52

    scanf_s("%s",str, sizeof(str)/sizeof(str[0]));
    とすれば直りました。
    ありがとうございます。
    よろしければこの文はどういう処理がされるのか教えていただきたいです。。。m(_ _)m

    キャンセル

  • 2017/03/09 15:07

    動作したとのこと、良かったですね。
    sizeof(str)/sizeof(str[0])は配列の要素数を取り出す定番テクニックです。
    http://kaworu.jpn.org/c/%E9%85%8D%E5%88%97%E3%81%AE%E8%A6%81%E7%B4%A0%E6%95%B0%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B

    C++11で多次元配列にも対応できる より強力なもの(std::extent)が出てますが、ちょっと難しいかも知れません。
    https://cpprefjp.github.io/reference/type_traits/extent.html

    キャンセル

0

先頭に

#pragma warning(disable:4996)

を入れてください。MS独自の仕様をキャンセルします^^
追記:
マイナス評価が付きましたが、VisualStudioでC,C++の勉強をするなら本でもネットでもMSの仕様でコードが書かれていない事が多いので私はやり易いと思っています^^

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/08 23:02

    先頭に#pragma warning(disable:4996)を追加したビルド結果。
    --
    1>c:\hoge\test.cpp(8): warning C4473: 'scanf_s': 書式文字列として渡された引数が不足しています
    1> c:\hoge\test.cpp(8): note: プレースホルダーとそのパラメーターには 2 の可変個引数が必要ですが、1 が指定されています。
    1> c:\hoge\test.cpp(8): note: 不足している可変個引数 2 が書式文字列 '%s' に必要です
    1> c:\hoge\test.cpp(8): note: この引数はバッファー サイズとして使用されます
    1> test.vcxproj -> c:\hoge\Debug\test.exe
    1> test.vcxproj -> c:\hoge\Debug\test.pdb (Full PDB)
    ========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========
    --
    デバッグ実行すると以下のように異常終了します。
    --
    0x100AE224 (ucrtbased.dll) で例外がスローされました (test.exe 内): 0xC0000005: 場所 0x00B00000 への書き込み中にアクセス違反が発生しました
    --
    どうしたらよいのでしょうか?

    キャンセル

  • 2017/03/08 23:13

    きつい言い方になったかもしれませんがすみません。お伝えしたいことは、むやみに警告を止めるのではなく一般的なC言語の説明ページで紹介されているscanfを使うように勧めたほうがまだましだということです。
    ちなみにscanfを使った場合、100文字以上入力すると「Stack around the variable 'str' was corrupted.」となりますが、「範囲外アクセスしたからだよ(結果はどうなってもしりませんよ)」と説明しやすいです。

    キャンセル

  • 2017/03/08 23:16

    scanf_sがMSの仕様ですので多くの所で使われていませんでした。(標準のscanfが使われているがVisualStudioでは4996を入れないとコンパイルが通りません。)
    私が始めた時にこればかりではなく他もMSの仕様を強いられたために苦労しましたので余計な苦労はして欲しくないなという気持ちで回答させていただきました。

    キャンセル

  • 2017/03/08 23:26

    前後してしまいましたが、can110さんの気持ちは分かりました。

    キャンセル

  • 2017/03/08 23:44

    VS2015でC++コンソールアプリ作成した場合はscanfは「warning C4996」扱いでビルドできますが、ソリューション設定によってはエラー扱いになりえますね。
    #pragma warning(disable:4996)を利用する意図について了解しました。レスありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • プログラミング言語

    679questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

  • ビルド

    58questions

    ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

  • char

    28questions

    charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。