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

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

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

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

Q&A

解決済

2回答

1005閲覧

c言語で10進数が格納された配列の配列をstrtolを使ってcharに変換したいが"conflicting types for strtol"とエラーが発生する

ijuya_yika

総合スコア50

C

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

0グッド

0クリップ

投稿2017/11/09 22:12

編集2017/11/10 19:08

###前提・実現したいこと
c言語で10進数が格納された配列の配列をstrtolを使ってcharに変換したい

###発生している問題・エラーメッセージ
conflicting types for strtol とエラーが出てコンパイルされない

###該当のソースコード

C

1#include <stdio.h> 2 3int main() 4{ 5 long i, j; 6 char* pt1 = "67"; 7 char* pt2 = "68"; 8 char* pt3 = "69"; 9 10 char* pt_arr[] = {pt1, pt2, pt3}; 11 j = sizeof(pt_arr)/sizeof(char*); //ご指摘を受けてsizeof(int*)からsizeof(char*)に変更 12 for(i=0; i<j ; ++i){ 13 long num = strtol(pt_arr[i],/* HELP */ , 10); //① 14 printf("%c", (char)num); //② 15 //putchar(atoi(pt_arr[i])); //③ 16 } 17 18 return 0; 19}

###試したこと
①,②のコードを③に置き換える

しかしこれでは10進数からの変換以外に対応できないし将来的には16進数にも対応したいということでstrtolを使いたい.

###補足情報(言語/FW/ツール等のバージョンなど)
ANSI Cを使用

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

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

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

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

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

guest

回答2

0

ベストアンサー

strtolの使い方はマニュアルを見ればわかると思います。
http://www9.plala.or.jp/sgwr-t/lib/strtol.html
第二引数はマニュアルにもある通り

文字列中に変換不可能 な文字があった場合には、その文字列のポインタをendptrに格納します。

で、対象の文字列が確実に変換できるものとわかっている(今回の例のように)ならNULLで良いです。

c

1// 10進数文字列から変換 2long num = strtol("100", NULL, 10); 3// 16進数文字列から変換 4long num = strtol("100", NULL, 16); 5

恐らく文字列には文字コードを指定しているようなので、出力に関しては②で問題ないでしょう。

ちなみに、

c

1j = sizeof(pt_arr)/sizeof(int*); 2 3```の後ろのsizeofは正確にはchar*を指定すべきです。 4どちらもアドレス値なのでサイズは同じだと思いますが。

投稿2017/11/09 23:38

ttyp03

総合スコア16998

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

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

ijuya_yika

2017/11/09 23:51 編集

ご回答ありがとうございます。 ①の部分の/*HELP*/をNULLに置き換えると、Conflicting types for 'strtol'を食らってしまうのですが、これはなぜなのでしょうか
ttyp03

2017/11/09 23:56

stdlib.hをインクルードしてみてください。↓ #include <stdlib.h>
ijuya_yika

2017/11/09 23:59

インクルード忘れとは…お恥ずかしい限りです。 ご回答ありがとうございました。
guest

0

strtolの使い方が分からないという質問でしょうか?
この場合は、第二引数はNULLで良いと思います。
詳細はstrtolのマニュアル参照。

投稿2017/11/09 23:38

otn

総合スコア84499

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

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

ijuya_yika

2017/11/09 23:52

ご回答ありがとうございます。既にNULLでも試したのですがConflicting types for 'strtol'に悩まされてしまっています。
otn

2017/11/09 23:59

OSとコンパイラは何でしょうか?Linux+gccだと、回答で示したマニュアルには、 #include <stdlib.h> と書いてありますが。
ijuya_yika

2017/11/10 00:03

Conflicting typeとあったので間違ったタイプを渡しているのではと決めつけていました。 ご指摘の通り、#include <stdlib.h>が抜けていたのが原因でした。 ご回答ありがとうございました。
otn

2017/11/10 00:12

初めて(or久々に)使う関数は、マニュアルを読みましょうね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問