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

実現したいこと

なぜ
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 else77 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

コメントを投稿

0 コメント