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

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

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

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

Visual Studio

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

プログラミング言語

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

4回答

2146閲覧

テキストファイルの数字をatoiで数値の配列(int num[])に入れたい

hogehogeo

総合スコア4

C

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

Visual Studio

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

プログラミング言語

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/04/15 01:43

前提・実現したいこと

今年の4月から初めてプログラミング言語に触れた初心者のため、初歩的なことがわかっていないと思います。ご了承ください。

現在、C言語を使って「テキストファイルに書かれた数字を一文字ずつ数値化し、昇順にソートする」というプログラムを組もうと考えています。
ファイルの中身を読み込むというところまではできたのですが、
「atoiを使って数字を数値に変換し、配列に格納する」という部分がうまくいきません。
多分初歩的なことが理解できていないためだと思うのですが、エラーコードについて調べてみても、どう直せばいいかわかりません。
具体的なコードの例を教えていただけると幸いです。
できればatoiを使用したコードの例だと嬉しいです。

使用ツール:visual studio community 2015
ファイル名:C:\temp\test.txt
テキストファイルの中身:9876543210

該当のソースコード

C

1while (fgetc(fp) != EOF) {//ファイルの最後じゃないとき 2 for (i = 0; i < 11; i++) { 3 num[i] = atoi(str[i]); 4 printf("%d", num[i]); 5 }

発生している問題・エラーメッセージ

エラーメッセージ 型"char"の引数は型"const char*"のパラメーターと互換性がありません。

試したこと

文字セットを変えてみる、char[]型からint[]型仕様への書き直しなどの方法が見つかったのですが、知識が足りず、理解には至りませんでした。
ご教授のほどよろしくお願いいたします。

以下はコードの全体です。

//コード全体 #include <stdio.h> //FILE構造体, fopen, fclose, fgetc、printfで使用 #include <stdlib.h>//atoiで使用 int main(void) { //変数の設定 FILE *fp; //ファイル構造体でポインタ変数fpを設定 const char *file = "C:\temp\test.txt";//アドレスを保存 char str[11];//ファイルの値を入れる int num[11];//str[]の値を入れる int i, j, k;//atoi、ソートで使用 //ファイルの読み込み fopen_s(&fp, file, "r") != NULL; //fopen_s(ポインタ変数のアドレスを指定,開くファイル名,rはテキストファイルの読み込み) //ファイルが存在しない場合のエラー処理 if (fp == NULL) { printf("ファイルが開けません\n"); return -1; //ファイルが存在するときの処理 while (fgetc(fp) != EOF) {//ファイルの最後じゃないとき for (i = 0; i < 11; i++) { num[i] = atoi(str[i]); printf("%d", num[i]); } } //数値を昇順にソート for (i = 0; i < 11; i++) { for (j = i + 1; j < 10; ++j) if (num[i] > num[j]) {// k = num[i];// num[i] = num[j]; num[j] = k; } } //昇順ソートした数字を出力 for (i = 0; i < 10; i++) { printf("%d", num[i]); } getchar(); fclose(fp); //ファイルを閉じる return 0; } }

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

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

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

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

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

guest

回答4

0

C

1int atoi(const char *nptr);

という宣言ですから、atoi は const char* 型のパラメータを受け取らねばなりません。
一方提示されたコードの str が何かは不明ですが、おそらく char * ないし char[] として宣言されていると思います。となると、str[i] は char です。

型が違うのですから、呼び出せるわけがありません。

そもそも1文字単位で数字→数値変換したいなら、atoi を使うのは間違いです。

余談:
atoi は変換できなかったとき、戻り値として 0 を返します。
つまり、0 なのか変換失敗なのか分かりません。

投稿2020/04/15 02:00

tacsheaven

総合スコア13703

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

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

0

そもそも論、一文字に収まる数字、つまり09ならば、文字コード上の連続が保証されていますので、単にc - '0'すればいいと思います。

あとfgetcで一文字読み込むのはいいのですが、その結果を何にも格納していないですよね?

c

1while(EOF != (c = fgetc(fp))) { 2 if ('0' <= c && c <= '9') { 3 // do something 4 } 5 else { 6 exit(1); 7 } 8}

とかするべきでは

投稿2020/04/15 04:58

yumetodo

総合スコア5850

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

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

0

提示のコードにはツッコミどころがたくさんあります。
が、それはまあ、横に置いといて、

atoi関数は、文字列のアドレス char* を引数に取る関数ですが、提示のコードでは、str[i]というchar を渡してます。これがエラーのもとです

やるなら、str にファイルを読み込んだあと(これがない)、str+i(これでもおそらく正しくない)をatoi に渡しましょう

投稿2020/04/15 02:03

y_waiwai

総合スコア87719

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

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

0

atoiは引数を見ればわかる通りchar*型を取ります。Cには文字列型というのは存在しないのでchar型先頭へのポインタを渡すことになります。上記コード例ではcharを直接渡してしまっています。なのであらかじめchar*のバッファを作り、渡された文字とnull文字(\0)をくっつけてバッファに書き込み、バッファのポインタをatoiに渡してやる、という流れになるかと思います。

投稿2020/04/15 02:01

A_kirisaki

総合スコア2853

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問