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

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

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

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

Visual Studio

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

Q&A

解決済

1回答

486閲覧

atoiに渡すポインターはなぜダブルポインターではダメなのか?

Q10

総合スコア12

C

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

Visual Studio

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

0グッド

0クリップ

投稿2023/05/29 08:07

実現したいこと

なぜ
int number = atoi(**ptr);
では動かず、
int number = atoi(*ptr);
だと動くのか知りたい。

前提

C言語でFind Intersectionという、二つの集合の中から部分集合を見つける問題を解いています。
その中で、
int read_number(char** ptr)
という関数を作り、その受け取ったptrの中から数字だけ抽出するのですが、
なぜ
int number = atoi(**ptr);
では動かず、
int number = atoi(*ptr);
だと動くのか知りたいです。

**ptrは指している文字一つだけで、
*ptrは指している文字から\0までの文字列全部だと認識しています。

それなら、文字一つ(例えば、'3')のみをatoiに渡すのが筋ではないでしょうか?

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

int number = atoi(**ptr);

にした場合に発生するエラーメッセージ

警告 C4047 '関数': 間接参照のレベルが 'const char *' と 'char' で異なっています。 警告 C4024 'atoi': の型が 1 の仮引数および実引数と異なります。

該当のソースコード

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include <math.h> 5#include <ctype.h> 6 7int read_number(char** ptr) 8{ 9 if (**ptr == '\0') 10 return -1; 11 12 while (!(isdigit(**ptr))) 13 (*ptr)++; 14 15 printf("*ptr: %s\n", *ptr); 16 17 int number = atoi(*ptr); // なぜ、ここだけ*が1つだけなのか? 18 //int number = atoi(**ptr); // なぜ、**ptrではいけないのか? 19 printf("number: %d\n", number); 20 21 while (**ptr != '\0' && **ptr != ',') 22 (*ptr)++; 23 24 printf("*ptr: %s\n", *ptr); 25 return number; 26} 27 28void FindIntersection(char* strArr[]) { 29 char* ptr_1; 30 char* ptr_2 = strArr[1]; 31 int intersection[64] = { 0 }; 32 int num_1, num_2; 33 int ndx = 0; 34 35 while (*ptr_2 != '\0') { 36 ptr_1 = strArr[0]; 37 printf("ptr_1: %s\n", ptr_1); 38 printf("ptr_2: %s\n\n", ptr_2); 39 num_2 = read_number(&ptr_2); 40 printf("num_2: %d\n\n", num_2); 41 42 while (*ptr_1 != '\0') { 43 num_1 = read_number(&ptr_1); 44 printf("num_1: %d\n", num_1); 45 printf("%d: %d ? %d\n", ndx, num_1, num_2); 46 47 if (num_1 > num_2) { 48 printf("num_1 > num_2 -> break\n\n"); 49 break; 50 } 51 else if (num_1 < num_2) { 52 printf("num_1 < num_2 -> continue\n\n"); 53 continue; 54 } 55 // num_1 == num_2 二つが同じだったら 56 else { 57 printf("num_1 == num_2 -> intersection[ndx++] = num_2 -> continue\n\n"); 58 intersection[ndx++] = num_2; 59 continue; 60 } 61 } 62 } 63 64 int* i = intersection; 65 66 if (intersection[0] == 0) { 67 printf("false\n"); 68 return; 69 } 70 71 while (*i != 0) { 72 printf("%d", *i); 73 74 if (*(++i) != 0) 75 printf(","); 76 else 77 printf("\n"); 78 } 79} 80 81 82int main(void) { 83 char* A[] = { "1, 3, 4, 7, 13", "1, 2, 4, 13, 15" }; 84 FindIntersection(A); 85 return 0; 86}

試したこと

int number = atoi(**ptr);


int number = atoi(*ptr);
の2パターンを試しました。

補足情報(FW/ツールのバージョンなど)

Visual Studio Community 2022

Examples
Input: {"1, 3, 4, 7, 13", "1, 2, 4, 13, 15"}
Output: 1,4,13

Input: {"1, 3, 9, 10, 17, 18", "1, 4, 9, 10"}
Output: 1,9,10

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

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

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

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

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

guest

回答1

0

ベストアンサー

atoiの引数は文字(char) ではなく 文字列(const char*) です。
たとえ一文字であっても 文字('3')ではなく 長さ1の文字列("3")を渡します。
※ じゃないと "13" を変換できんでしょ?

投稿2023/05/29 08:14

編集2023/05/29 08:23
episteme

総合スコア16614

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

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

Q10

2023/05/29 08:50

ベストアンサーです。 最後の「※ じゃないと "13" を変換できんでしょ?」が大納得で身に沁みました。 質問して良かったです。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問