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

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

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

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

Q&A

解決済

3回答

2354閲覧

atoi関数を適用できない。

Savanof

総合スコア33

C

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

0グッド

0クリップ

投稿2021/05/31 10:33

前提・実現したいこと

C言語で多倍長整数の加算を行いたいと思っています。多倍長整数の計算を行うにあって、下の様な形のワークフローでの実装を考えています。

1. 文字列を2つ受け取る : ["1","2","3","4","5"] , ["1","7","8","9","1"] 2. 配列を逆に変換する  : ["5","4","3","2","1"] 3. 作成された二つの配列のうち、大きいサイズの方のサイズを基に新しい配列を作成する。 4. 二つの配列のそれぞれの要素の足し算を行う 例 : [5,4,3,2,1] と [1,9,8,7,1] という配列の場合 [(5+1) , (4+9) , (3+8) , (2+7) , (1+1)] → [6,13,11,9,2] ※ もし リストへのアクセスができない、範囲外の場合は0を割り当てる。 7. ある桁の数が10以上であれば、その桁を-10して、次の桁に1足す [6,13,11,9,2] → [6,3,2,0,3] 8. 配列を逆順にして、文字列に直す → "30236"

上のワークフローの4番をatoi関数を使って実装する事を考えているのですが、atoi関数を上手く適用させる事ができません。

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

.\new.c: In function 'main': .\new.c:71:23: warning: passing argument 1 of 'atoi' makes pointer from integer without a cast [-Wint-conversion] num1 = atoi(p_input1[i]); ^~~~~~~~ In file included from .\new.c:2:0: c:\mingw\include\stdlib.h:335:38: note: expected 'const char *' but argument is of type 'char' _CRTIMP __cdecl __MINGW_NOTHROW int atoi (const char *); ^~~~ .\new.c:78:23: warning: passing argument 1 of 'atoi' makes pointer from integer without a cast [-Wint-conversion] num2 = atoi((p_input2[i])); ^ In file included from .\new.c:2:0: c:\mingw\include\stdlib.h:335:38: note: expected 'const char *' but argument is of type 'char' _CRTIMP __cdecl __MINGW_NOTHROW int atoi (const char *);

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <stdint.h> 4#include <string.h> 5#include <strings.h> 6#define MAX_INPUT 100 7 8 9// 二つの数を比較して大きい方を選択する 10int max(int a, int b) { return a > b ? a : b; } 11 12 13// 文字配列を逆順にする 14void revStr(char* str){ 15 int size = strlen(str); 16 int i,j; 17 char tmp = {0}; 18 19 for(i = 0, j = size - 1; i < size / 2; i++, j--){ 20 tmp = str[i]; 21 str[i] = str[j]; 22 str[j] = tmp; 23 } 24 25 return; 26} 27 28 29 30// main 31int main(){ 32 33 char input1[MAX_INPUT]; 34 char input2[MAX_INPUT]; 35 const char *p_input1 = input1; 36 const char *p_input2 = input2; 37 38 int input1_siz; 39 int input2_siz; 40 int ans_size; 41 42 43 printf("Enter The First LongInt"); 44 fgets(input1 , MAX_INPUT , stdin); 45 46 printf("Enter The Second LongInt"); 47 fgets(input2 , MAX_INPUT , stdin); 48 49 printf("%s",input1); 50 printf("%s",input2); 51 52 // input1,input2の配列サイズを入手する 53 input1_siz = strlen(input1); 54 input2_siz = strlen(input2); 55 56 // 二つの配列の内大きい方を作成する。 57 int N = (max(input1_siz, input2_siz)); 58 int ans_lis[N]; 59 60 revStr(input1); 61 revStr(input2); 62 63 for (int i = 0; i < N; i++){ 64 65 int num1 , num2; 66 // OutOfIndexしないようにする。 67 if(input1_siz < N){ 68 num1 = 0; 69 } 70 else{ 71 num1 = atoi(p_input1[i]); 72 } 73 74 if(input2_siz < N){ 75 num2 = 0; 76 } 77 else{ 78 num2 = atoi((p_input2[i])); 79 } 80 81 ans_lis[i] = (num1 + num2); 82 83 } 84 85 for(int i = 0; i < N; i++){ 86 printf("%d",ans_lis[i]); 87 } 88 89 90 91}

試したこと

atoi関数のreturnも整数型でatoi関数に入れている引数もconst *charを入れていると思うのですが、errorコードが取れません。
お忙しいとは思いますが、よろしくお願いいたします。
情報に不足がありましたら、ご指摘お願いいたします。

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

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

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

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

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

otn

2021/05/31 11:19

この前、私が解決方法を回答したのですが、 ・全く読んでいない ・読んだが質問すら出来ないくらい理解できない のどちらでしょうか?
Savanof

2021/05/31 12:03

先日は解決方法の回答ありがとうございました。 otnさんの回答は読んである程度理解したつもりです。 正直、自分の様な低レベルの人間が「自分で考えて実装したい」というのはおこがましいかもしれませんが、自分でロジックを考えて自分で実装したいと思ったので、スレッドを分けて質問させていただきました。
otn

2021/05/31 12:23

ロジックは考えることなので自分で考えるとして、「どうやって文字を数値に変換するか」は知識なので、取り入れると良いと思いますよ。
guest

回答3

0

atoiの引数は、nullコードでターミネートされていて、long intに変換できる数字コードの列でなければ成りません。

一度、長さ2の文字配列の0文字目にコピーして、1文字目をnullにしたものをatolに渡しましょう。

投稿2021/05/31 10:46

ppaul

総合スコア24666

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

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

0

const char p_input1 = input1; なので
num1 = atoi(p_input1[i]); において p_input1[i] は const char です。
(const)char
ではありません。

※ てか、数字一文字を数値に変換するんなら '0' を引くだけでいい。

投稿2021/05/31 10:42

編集2021/05/31 10:48
episteme

総合スコア16614

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

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

Savanof

2021/05/31 12:05

回答ありがとうございます。ポインタのかかる所を間違えていました。
guest

0

ベストアンサー

num1 = atoi(p_input1[i]);

エラーメッセージの通りですね。
const char *p_input1 とあるので、 p_input1がポインタ。従って p_input1[i] は、charとなります。もし、i番目以降の文字なら、 &p_input[i] とアドレスを与えてください。

投稿2021/05/31 10:42

pepperleaf

総合スコア6383

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

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

Savanof

2021/05/31 12:06

回答ありがとうございます。ポインタとして宣言すれば、配列の要素もポインタになると勘違いしていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問