92651


自分の書いたコードは課題の題意を汲み取れているでしょうか。  
実行結果は合っています。

かなり見づらく読み取りにくいコードであることは自認しています。  
申し訳ありません。

常識的な部分(関数名、変数名がおかしい等)で不足がありましたら  
その点についてもご指摘いただけるとありがたいです。

気になる点が二つありますのでご教授頂きたいです。

#### 1点目

条件4にて関数を呼び出す際  
_str_dist_a_ ( **str** , aa, ba); _str_dist_p_ ( **str** , ap, bp);  
とありますが、 **str** が定義できていないため呼び出せず、作題ミスと踏んで **s** と置きました。この判断は間違いでしょうか。(=
**str** のままで理想的なコードが書けるか否か)

#### 2点目

仮引数がポインタの関数 _str_dist_p_
で左辺が配列のようになってしまいました。自分の認識ではポインタに[]をくっつけて行列のように利用できる性質を利用したのですがこの認識で合っていますでしょうか。

### コード

[code]

    #include<stdio.h>
    
    void str_dist_a(char str[], char x[], char y[]);
    void str_dist_p(char* str, char* x, char* y);
    
    void str_dist_a(char str[], char x[], char y[])     //  x=even ,    y=odd
    {
        int i, ix, iy;
    
        ix = 0; iy = 0;
    
        for (i = 0; str[i] != '\0'; i++)
        {
            if (i % 2 == 0) //[even]
            {
                x[ix] = str[i];
                ix++;
            }
            else    //[odd]
            {
                y[iy] = str[i];
                iy++;
            }
        }
        x[ix] = '\0';   y[iy] = '\0';
    }
    
    void str_dist_p(char* str, char* x, char* y) // x = even,   y = odd
    {
        int i, ix, iy;
    
        ix = 0; iy = 0;
    
        for (i = 0; *(str + i) != '\0'; i++)
        {
            if (i % 2 == 0) //[even]
            {
                x[ix] = *(str + i);//左辺で配列っぽい
                ix++;
            }
            else    //[odd]
            {
                y[iy] = *(str + i);//左辺で配列っぽい
                iy++;
            }
        }
        x[ix] = '\0';   y[iy] = '\0';//左辺で配列っぽい
    }
    
    
    int main(void)
    {
        char s[120];
        char aa[64];    char ba[64];    char ap[64];    char bp[64];
    
        printf("文字列：");     scanf("%s", s);
    
        str_dist_a(s, aa, ba);
    
        printf("配列での分配文字列1＝%s\n", aa);
        printf("配列での分配文字列2＝%s\n", ba);
    
        str_dist_p(s, ap, bp);
    
        printf("ポインタでの分配文字列1＝%s\n", ap);
        printf("ポインタでの分配文字列2＝%s\n", bp);
    
        return 0;
    }
    
    /*
    文字列：baapnpalnea
    配列での分配文字列1＝banana
    配列での分配文字列2＝apple
    ポインタでの分配文字列1＝banana
    ポインタでの分配文字列2＝apple
    
    */
    
[/code]

### 課題の内容

[![課題の内容](https://i.stack.imgur.com/cDYoy.png)](https://i.stack.imgur.com/cDYoy.png)


CC BY-SA 4.0
2022-12-08T16:10:36.963
92647
2022-12-09T03:20:06.350
2022-12-08T23:56:22.320
3060
55857
question
c ポインタ
書いたコードは課題で求められていることに合致しているか


> ・条件4にて関数を呼び出す際  
>  str_dist_a(str, aa, ba); str_dist_p(str, ap, bp);  
>
> とありますが、strが定義できていないため呼び出せず、作題ミスと踏んでsと置きました。この判断は間違いでしょうか。(=strのままで理想的なコードが書けるか否か)

一応、`char* str = s;`とでも追加で書けば題意を満たしたコードは書けますが、  
おそらく問題側のミスでしょう。  
心配なら作問者に問い合わせましょう。

> ・仮引数がポインタの関数
> str_dist_pで左辺が配列のようになってしまいました。自分の認識ではポインタに[]をくっつけて行列のように利用できる性質を利用したのですがこの認識で合っていますでしょうか。

多分、  
`*(x+ix) = *(str + i);`  
と書けという意図でしょう。

* * *

課題というのはその課題が出される文脈というのがあるので、無関係な立場からだと完全な推測にしかならないです。  
今回であれば、「配列として扱う」の意味です。  
`a[i]`というのは`*(a+i)`と同義で、  
「配列として扱う」という用語があるわけでもないので。


CC BY-SA 4.0
2022-12-08T23:40:53.770
92651
2022-12-08T23:40:53.770
13127
92647
answer


`str` については設問のミスのように見えます。

* * *

C の配列とポインタの間には暗黙の型変換や調整のルールがあります。

  * 仮引数に現れる配列形式の宣言はポインタに読み替えられる (この場合では `char str[]` は `char* str` と書いたことと同じと見なされる)
  * 式中に現れる配列は一部の例外を除いて (その配列の先頭要素を指す) ポインタに変換される
  * `x[ix]` というような式は `*(x+ix)` の構文糖 (表記上の見栄えのためのルール) である

つまり大雑把に言えば配列に対する操作のように見えているほとんどの式は言語仕様の理屈だとポインタ演算に読み替えられます。

飛躍した想像ではありますが見かけ上は異なっていてもやっていることが同じということを理解しているかを確認する、あるいは今後の講義でそのことを説明するつもりで前フリとして課題にしたということなのだと思います。


CC BY-SA 4.0
2022-12-09T03:20:06.350
92655
2022-12-09T03:20:06.350
3364
92647
answer