実現したいこと
なぜ
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

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/05/29 08:50