65892


c言語でシーザー暗号の暗号化と復号を実現したくてコードを書いたのですがうまくいきません。

**エラーメッセージ**  
コンパイル時に

[code]

    sizer3.c:31:2: warning: implicit declaration of function 'elseif' is invalid in C99 [-Wimplicit-function-declaration] elseif(j==1){ ^ sizer3.c:31:14: error: expected ';' after expression elseif(j==1){ ^ ; sizer3.c:46:3: error: expected expression else{ ^ 1 warning and 2 errors generated.
    
[/code]

とでます。

**ソースコード**

[code]

    #include <stdio.h>
    #define LEN 255
    
    int main(void)
    {
      char string[LEN];
      char angou[LEN];
      int  key, number, i,j;
    
    printf("暗号作成のときは0を\n");
    printf("暗号解読のときは1を\n");
    printf("終了するときは2を入力して下さい:");
    scanf("%d",&j);
    
     if(j==0){
     printf("鍵を入力してくだい:");
     scanf("%d", &key);
    printf("文字列を入力してください:");
     scanf("%s", string);
    
     i = 0;
     while(string[i] != '\0'){
       number = string[i] + key;
       angou[i] = number;
       ++i;
     }
     angou[i] = '\0';
    
     printf("作成された暗号:%s\n", angou);
    }
     elseif(j==1){
     printf("鍵を入力してくだい:");
     scanf("%d", &key);
     printf("文字列を入力してください:");
     scanf("%s", string);
     i = 0;
     while(string[i] != '\0'){
     angou[i] = string[i] - key;
     i++;
     }
     angou[i] = '\0';
     printf("暗号の解読結果(平文):%s\n", angou);
    }
      else{
      printf("終了");
    }
    
    return 0;
    }
    
[/code]


CC BY-SA 4.0
2020-04-23T10:02:27.700
65889
2020-04-29T23:39:49.970
2020-04-28T06:43:24.360
19110
39787
question
c
シーザー暗号の暗号化と復号


`elseif(j==1)` と続けて書いてしまうと `elseif`
という関数の呼び出しと解釈されてしまいます。そんな関数は宣言されていないよ＋実際リンクしても存在しないよ、でエラーとなっています。真にやりたいのは
`else if(j==1)`
なのだろうと推測（あなたのコードと違いスペースが１つ入っています。これによってキーワードが分離できているので当初の期待通りであろうと思う）

こういうのを避けるには

  * `if` には必ず `{ ...}` のように(複文でなくても)必ず鍵かっこを使う
  * `if` でなくて `switch` を使う

のがまあ定石ですよね。


CC BY-SA 4.0
2020-04-23T11:08:50.760
65892
2020-04-23T11:08:50.760
8589
65889
answer


Cの`if`には他言語にあるような`elseif`または`elsif`構文はありません。`else`の中に`if`をネストすればよいので、こうは書けます

[code]

    if(条件) {
       :
    }
    else if(条件){
       :
    }
    
[/code]

ただし、典型的なバグを作り込みがちな書き方ではあるので、

[code]

    if(条件) {
       :
    }
    else {
        if(条件){
           :
        }
    }
    
[/code]

こう書くことをお勧めします。

* * *

ちなみにエラーの内容は以下のとおりです

> `sizer3.c:31:2: warning: implicit declaration of function 'elseif' is
> invalid in C99 [-Wimplicit-function-declaration] elseif(j==1){ ^`

`elseif`という関数が宣言または定義されていないのに呼び出そうとしていることへの警告です。これは **エラーではありません** 。

> `sizer3.c:31:14: error: expected ';' after expression elseif(j==1){ ^ ;`

`elseif`が関数呼び出しと解釈されているために、文法上`elseif()`の後にセミコロンが必要です。

> `sizer3.c:46:3: error: expected expression else{ ^ 1 warning and 2 errors
> generated.`

今のコードは、

[code]

    if(...){
      :
    } //ここでifは終わり
    
    elseif();
    
    {
       //空のブロック
    }
    
    else { 
    }
    
[/code]

こう解釈されています。ifに対応しないelseが現れているのでこれに対するエラーです。

コンパイルが失敗している直接の原因は`elseif`が定義されていないことではなく、文法違反となっていることです。仮に`elseif`関数を定義したとしても、文法違反は解消しないのでコンパイルできないことには変わりありません。


CC BY-SA 4.0
2020-04-24T23:55:41.347
65934
2020-04-29T23:39:49.970
2020-04-29T23:39:49.970
5793
5793
65889
answer