一文字入力させて、まとめて出力させるプログラムを作りたいです。
何文字も入力させてまとめて出力させるプログラムは配列を使ってなんとかうまくいったのですが、一文字だけ入力させるものがうまくいきません。
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);
}
No.4
- 回答日時:
なぜ1文字コピーするのにstrcpy()を使うの?
strcpy()の仕様を確認しましょう。
strcpyは文字列をコピーする関数であり1文字分のコピーをする関数ではない。
文字列とは必ずヌル文字で終端されている。strcpy()等の文字列を扱う関数はこのヌル文字終端を前提に作られていることを忘れてはならない。
ヌル文字はれっきとした1文字なので1文字の文字列はchar型2個分のメモリが必要です。
最後の出力もまずい。
printf()関数で%sを使う場合もヌル文字終端がないと暴走する。
No.3
- 回答日時:
間違いを指摘しておくと
① iの型が変。なぜポインタ?
②aを1からkazuまで回したら
ポインタ配列の領域外にアクセスしてしまう。
0からkazu-1 だよね。
③文字格納用エリアの長さは2必要。
nullターミネ―トもしてない。
で、*(a+b)はプログラムを読みにくくするだけだから
やめよう。
No.2
- 回答日時:
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);
}
No.1ベストアンサー
- 回答日時:
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);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
strchr() の第2引数はなぜ int ...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
間接操作のレベルとは
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
ftoa の作り方
-
標準ライブラリ関数の自作につ...
-
c言語です。
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
起動時の引数の取得方法が分か...
-
コマンドラインに入力されてい...
-
配列をnビットシフトする
-
RGB→YUV変換のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報