アプリ版:「スタンプのみでお礼する」機能のリリースについて

一文字入力させて、まとめて出力させるプログラムを作りたいです。
何文字も入力させてまとめて出力させるプログラムは配列を使ってなんとかうまくいったのですが、一文字だけ入力させるものがうまくいきません。
a[i]といったカッコを使わずに同じ機能の*(a+i)のみでプログラムを作りたいです。
分かる方、教えていただけますでしょうか。
文字入力画面でフリーズしてしまいます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
    int kazu;
    int a;
    char *i;

    printf("何個データを入力しますか:");
    scanf("%d",&kazu);
                
    char **strage = (char **)malloc(kazu * sizeof(char*));
    char *i;
    for(a=1;a<kazu+1;a++){
        printf("1文字入力してください :");
        scanf("%c",i);
        *(strage+a) = (char *)malloc(sizeof(char));
        strcpy(*(strage+a),i);
                    
    }
    for(a=1;a<kazu+1;a++){
        printf("%d番目の文字:%s\n",a,*(strage+a));
    }
    free(strage);
}

A 回答 (4件)

なぜ1文字コピーするのにstrcpy()を使うの?


strcpy()の仕様を確認しましょう。
strcpyは文字列をコピーする関数であり1文字分のコピーをする関数ではない。
文字列とは必ずヌル文字で終端されている。strcpy()等の文字列を扱う関数はこのヌル文字終端を前提に作られていることを忘れてはならない。
ヌル文字はれっきとした1文字なので1文字の文字列はchar型2個分のメモリが必要です。

最後の出力もまずい。
printf()関数で%sを使う場合もヌル文字終端がないと暴走する。
    • good
    • 0
この回答へのお礼

詳しくありがとうございます。

お礼日時:2020/11/28 17:42

間違いを指摘しておくと


① iの型が変。なぜポインタ?
②aを1からkazuまで回したら
ポインタ配列の領域外にアクセスしてしまう。
0からkazu-1 だよね。
③文字格納用エリアの長さは2必要。
nullターミネ―トもしてない。

で、*(a+b)はプログラムを読みにくくするだけだから
やめよう。
    • good
    • 0
この回答へのお礼

分かりました。ありがとうございます!

お礼日時:2020/11/28 17:43

No1です。


どうしても、char **strageにしたいなら、以下のようにしてください。
*(stage+a)のメモリ解放はしていません。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
int kazu;
int a;

printf("何個データを入力しますか:");
scanf("%d",&kazu);

char **strage = (char **)malloc(kazu * sizeof(char*));
char i[256];
for(a=0;a<kazu;a++){
printf("1文字入力してください :");
scanf("%*c%c",i);
*(strage+a) = (char *)malloc(sizeof(char)*2);
i[1] = '\0';
strcpy(*(strage+a),i);

}
for(a=0;a<kazu;a++){
printf("%d番目の文字:%s\n",a+1,*(strage+a));
}
free(strage);
}
    • good
    • 0

strageは


char **strageでなく、char *strageで良いと思いますが、いかがでしょうか。
その形に修正しました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
int kazu;
int a;
char i;

printf("何個データを入力しますか:");
scanf("%d",&kazu);

char *strage = (char *)malloc(kazu * sizeof(char));
for(a=0;a<kazu;a++){
printf("1文字入力してください :");
scanf("%*c%c",&i);
*(strage+a) = i;

}
for(a=0;a<kazu;a++){
printf("%d番目の文字:%c\n",a+1,*(strage+a));
}
free(strage);
}
    • good
    • 0
この回答へのお礼

助かりました

実行できました!
char*で実行したかったので、とても助かりました。
本当にありがとうございます。

お礼日時:2020/11/26 19:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!