実現したいこと:コマンドライン引数から入力した数字を「入力値:X X X X」のように出力したいと考えています。
コンパイルを行うと、strToNum()関数を定義した部分とstrtolを使用した部分でコンパイルエラーを起こします。
何がダメなのでしょうか。
#include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]){ long Num[10]; int j; strToNum(argc, argv, Num); printf("入力値:"); for(j = 0; j <= argc; j++){ printf("%d ", Num[j]); } return 0; } int strToNum(int argc, char **argv[], long *Num[]){ int i; char *end[10]; for(i = 0; i<= argc; i++){ *Num[i] = strtol(**argv[i + 1], &end[i], 10 ); } return 0;
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
- 呼び出し先の関数で、1次元配列の先頭の要素から順次アクセスするには、「配列の先頭要素のポインター値」を渡せばいい。受け取る側の仮引数は、「ひとつの要素に対するポインター変数」になる。
- 呼び出し先の関数で、1次元配列の要素数を超えて書き込むのを防げるように、引数で配列の要素数を渡すといい。配列の要素数は、「sizeof(配列名) / sizeof(要素の型)」で求められる。
- 呼び出し先の関数の返り値(現在0で固定)に、「1次元配列に値を格納した総数」を設定すれば、呼び出し元でそれを利用して出力できる。
- 呼び出し先の関数のfor文の中で、
argv[i + 1]
でコマンドライン引数にアクセスすることを考えると、「i
はargc - 1
より小さい」という条件でなければならない。「i
はargc - 1
以下」とか、「i
はargc
より小さい」という条件だと、実際のコマンドライン引数の個数を超えてargv
にアクセスしてしまう。 - 変換不可能な文字列への処理を行なわないのであれば、
strtol
の第2引数にはNULL
を指定する。
C
1#include <stdio.h> 2#include <stdlib.h> 3 4int strToNum(int argc, char *argv[], int numc, long int *num); 5 6int main(int argc, char *argv[]) 7{ 8 long int num[10]; 9 int count = strToNum(argc, argv, sizeof(num) / sizeof(long int), num); 10 11 printf("入力値:"); 12 for (int i = 0; i < count; i++) { 13 printf("%d ", num[i]); 14 } 15 16 return 0; 17} 18 19int strToNum(int argc, char *argv[], int numc, long int *num) 20{ 21 int count = 0; 22 for (int i = 0; i < argc - 1 && i < numc; i++) { 23 num[i] = strtol(argv[i + 1], NULL, 10); 24 count = i + 1; 25 } 26 return count; 27}
投稿2020/10/19 09:04
総合スコア11990
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
提示されたコードはコピペミスだと思いますが、strToNum関数の閉じ括弧がありません。
コンパイルエラーという括りであればそれくらいです。
あとはwarningが出ているかもしれませんが、strToNumのプロトタイプ宣言がありませんので、冒頭で宣言するようにしましょう。
あとコンパイルエラーではないですが、以下の文は正しくありません。
c
1for(i = 0; i<= argc; i++){
引数が1つの場合、argcには2が入ります。
つまりargv[0]とargv[1]には値が入っているということです。
上記のループ条件ではargv[2]も参照してしまうので、正しい動作はしないでしょう。
投稿2020/10/19 06:21
総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
int strToNum(int argc, char **argv[], long *Num[]){
まずはこの引数 argv の型が間違ってます
strToNum(argc, argv, Num);
これでは引数の型が合いません
また、
*Num[i] = strtol(**argv[i + 1], &end[i], 10 );
引数の与え方が間違ってます
投稿2020/10/19 06:13
総合スコア88163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。