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

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

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

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

Q&A

解決済

3回答

588閲覧

C言語のstrtolを使った関数について

nkt070408

総合スコア29

C

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

0グッド

0クリップ

投稿2017/09/06 01:47

C言語について質問です。
下記のような簡単な数式プログラムに入力文字が数値か判断する関数を組み込んだところ、アクセス違反になってしまいます。どこを修正したら良いでしょうか。
また、入力もscanf_s以外のものを使ったほうがいいでしょうか。
よろしくお願いします。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int tanka = 0; 6 int suryo = 0; 7 int kingaku = 0; 8 int zeikomi = 0; 9 int a = 0; 10 int b = 0; 11 12 printf("単価="); 13 scanf_s("%d",&tanka); 14 15 a = check_arg(tanka); 16 17 printf("数量="); 18 scanf_s("%d",&suryo); 19 20 b = check_arg(suryo); 21 22 kingaku = a * b; 23 zeikomi = kingaku * 108 / 100; 24 25 printf("金額=%d、税込み=%d",kingaku,zeikomi); 26 return 0; 27}

C

/*check_arg.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void check_arg(char* input_value)
{
int input_num = 0;
char *endptr = NULL;

input_num = strtol(input_value, &endptr, 10); if (endptr != '\0') { printf("整数を入力してください"); return -1; } return 0;

}

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

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

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

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

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

guest

回答3

0

あなたの書いたcheck_arg関数は、文字列を引数として渡して、それが数字からなるかどうかをチェックしていますが、メイン関数では、scanf_s("%d" で整数を入力してその整数をcheck_arg関数に渡すという意味不明の事をしています。アクセス違反は当然です。

あと、check_arg関数の戻り値は何だと思っていますか?

自分の書いたプログラムを、それぞれの文が何をしているのか、声に出しながら確認して下さい。

投稿2017/09/06 02:17

otn

総合スコア84557

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

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

nkt070408

2017/09/06 02:34

回答ありがとうございます。 整数を文字列と比較してしまってエラーになっていることはわかりました。さらにcheck_arg関数で数値かどうか判断して返すはずがそもそも戻り地がないためやっていることが無意味でめちゃくちゃだと反省しました。 早速修正します。
guest

0

エラーになる理由は、char*型の引数に対して、int型を渡しているからです。
そしてcheck_arg関数で行いたいのは整数か否かだと思われますが、入力をint型で受け取っている以上、正数値が格納されていますからstrtolでのチェックはできません。
scanfでは文字列で受け取ってから、strtolで変換、エラーチェック、という流れが適切です。

投稿2017/09/06 02:15

ttyp03

総合スコア16998

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

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

nkt070408

2017/09/06 02:37

回答ありがとうございます。 以前のプログラムではchar型の配列に文字列を格納して使っていたのでそれと同じように中身を考えずに使ってしまったのが元々の原因でした。 入力値や型についてもっと理解を深めます。
guest

0

ベストアンサー

この状況では、check_argを用意しても無意味です。

scanf_s("%d")で読み取る以上、そもそも数値しか読み取れません。

そして、char*の引数に無理やりintを渡したためにエラーとなっています。

投稿2017/09/06 02:06

maisumakun

総合スコア145184

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

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

nkt070408

2017/09/06 02:39

回答ありがとうございます。 型が違うもの同士を比較しているため、アクセス違反が起きているということに気づけなかった自分が情けないです。 数値しか読み取れないところもわかっていなかったので勉強しなおしてきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問