

下記は自分のプログラムなのですがどうしても実行結果がうまくいきません。  
for文かmallocのどちらかがおかしいと思うんですが分かりません。

**問題:**

> キーボードから空白類を含まない 32bytes 未満の文字列を 1
> つ入力すると、その文字列の各文字を2つずつに増やした新しい文字列を入れる領域をmallocで確保し新しい文字列を入れ、表示した後メモリを解放して終了するプログラムを作成せよ。
>
> 例："abc" → "aabbcc"

**現状のプログラム**

[code]

    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h> 
    
    int main(void){
    
      char *p,q[32];
      int i,k,j;
    
      printf("Input MOZI:");
      scanf("%s",q);
    
      i=strlen(q);
    
      p=(char *)malloc(sizeof(char)* i * 2);
      if(p == NULL){exit(1);}
    
       printf("%d\n",i);
    
      for(k=0;k<i;k++){
        for(j=0;j<2;j++){
       *p=*q;
       *p++;
        }
      j=0;
      ++*q;
    
      }
      printf("%s\n",p);
      printf("%s\n",q);
    
      free(p);
    
    }
    
[/code]


CC BY-SA 4.0
2020-02-24T07:30:57.407
63321
2020-02-24T23:13:48.787
2020-02-24T08:01:08.907
3060
37943
question
c
C言語　ポインタ　領域確保


*p++と++*qをp++と++qに変えてみて下さい。  
ポインタを進めたいのであって、中身を変えたいわけではありませんよね？  
*を使うとポインタの指す中身が参照されます。  
ちなみに厳密にいえば、*よりも++が優先されるはずなので、*p++は問題ありません。が、紛らわしいのでアスタリスクは外したほうがいいと思われます。


CC BY-SA 4.0
2020-02-24T16:58:58.713
63327
2020-02-24T16:58:58.713
37855
63321
answer


ザッと見たところでは、以下の様な問題があります。  
学習のために何処の何がと細かい指摘はしませんので、自分で調べてみてください。

  * 取得する入力文字列を32bytes未満に収めるための対処をしていない
  * 領域確保の際に文字列の終端を示すデータの長さを考慮していない(@akira ejiriさん指摘)
  * 各文字をコピーする過程で元々のポインタそのものを書き換えている(のでその後の表示や領域解放が上手く行かない)
  * コピー先文字列の終端を示すデータが書きこまれていない


CC BY-SA 4.0
2020-02-24T22:30:27.277
63328
2020-02-24T23:13:48.787
2020-02-24T23:13:48.787
26370
26370
63321
answer