Nari-623
@Nari-623 (na ri)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

c コマンドライン引数でのエラー

Q&A

Closed

解決したいこと

ここに解決したい内容を記載してください。
cで1からコマンドライン引数で受け取った値までの和を返すコードを作っています。
その際ターミナルで
(実行ファイル) -n (1以上の整数)
と入力した場合(1)、1から(1以上の整数)までの和を出力し
(実行ファイル) --help
と入力した場合(2)コードの使用方法を出力し
(実行ファイル)
と入力した場合(3)1から10までの和を出力するコードを目標としており(1),(2)に関しては正常に動作するのですが(3)のように実行しようとするとエラー(Segmentation fault)が起こってしまいます。コンパイルはエラー、警告いずれもなく実行できます。

解決方法をご存知の方がいらっしゃれば教えていただきたいです。

発生している問題・エラー

Segmentation fault

### 該当するソースコード
```c

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(int argc,char *argv[]){
    int i, n;
    int sum = 0;

    if(strcmp(argv[1],"-n")==0 && argc==3 && atoi(argv[2])>0){
    n = atoi(argv[2]);
    for(i=1;i<=n;i++){
        sum += i;
    }
    printf("1から%dまでの和は\n%dです。\n",n,sum);
    }
    else if(strcmp(argv[1],"--help")==0){
    printf("このコードの使い方");
    }
    else if(argc==1){
    printf("1から10までの和は\n55です。\n");
    }
    else{
    printf("erorr!\n");
    }
    return 0;
}

0

1Answer

if() {
} else if() {
} else if() {
}

といったような構造があったとき、①が偽だったときに②が、②が偽だったときに③が評価されます。 つまり、③が評価される前に①と②が評価されているのです。

今回の質問にあてはめると、 argc==1 が成立するときにも (① に含まれている) argv[1] が評価されることになりますが、 argv には一個しか値が入っていないので argv[1]"-n" を比較しようとするのはアクセス違反ということになってしまいます。

チェックの順序を逆にするとよいです。

2Like

Comments

  1. @Nari-623

    Questioner

    わかりやすい説明ありがとうございます。
    実はqiita使うのが初めてでかなり下手な質問だったと思いますが無事解決することができて安心しています。
  2. 解決できたのならば質問をクローズしてください。

Your answer might help someone💌