
C言語を勉強している者です。以下の問題を解いてみたのですが、
エラーは特にないですし、実行結果も正しいものが表示されるのですが、フリーズされてしまい、表示画面が固まってしまいます。
また、問題文の沿って答えを出したいのですが、(3)のあたりが題意に沿えていないように感じます。
この2つのことで困っております。差し支えなければ、どなたかアドバイス頂けるたら幸いです。
(問題)以下の条件と、実行結果の例をもとにして、キーボードから入力した文字列を反転させるプログラムを作りなさい。
(1) 文字列の長さの最大値は16文字。
(2) キーボードから入力された文字列を、その長さ+1の配列変数をmalloc()で生成させて代入する。
(3) (2)で生成させた配列に、入力させた文字列を反転させたデータを入れる。
(4) 結果を出力する。
(5) 生成したメモリを、free()で開放する。
期待される実行結果の例
文字列を入力(最大16文字):ABCDE ← キーボードから入力
EDCBA
(私が作成したもの)
#include<stdio.h>
#include<stdlib.h>
#define SIZE 17
void main() {
char s[SIZE];
char *p = NULL;
p= (char*)malloc(sizeof(char)*SIZE);
printf("文字列を入力(最大16文字):");
scanf_s("%s", s,SIZE);
p = s;
while (*p!='\0'){
p++;
}
while (--p >= s) {
putchar(*p);
}
putchar('\n');
free(p);
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
1.配列sのi番目の要素(文字)はs[i]でアクセスできる。
2.同様にmallocで確保した領域のi番目の要素はp[i]でアクセスできる。
ポインタ変数pの値を変更する必要はない。
3.例えばsに3文字入力した場合、最終文字はs[2]に格納されている。
最終文字位置はstrlenを使用すれば得られる。
4.反転は、3の例で、s[2]~s[0]をp[0]~p[2]へコピーすれば良い。
forやwhileを使用。
5.3の例で、p上のデータを文字列データとするためにp[3]に'\0'をセットする。
6.pを配列の先頭とする文字列をprintfで表示させる。
No.1
- 回答日時:
>p= (char*)malloc(sizeof(char)*SIZE);
この時点で、「その長さ+1の配列変数をmalloc()で生成させて代入する。」ではありません。
一次受けとしてのchar s[SIZE]は、おそらく正しいでしょうが…。
で、確保したメモリへのポインタは
>p = s;
の時点で消失します。(確保したメモリブロックはそのまま)
なので、
>free(p);
はauto変数に対して実行していることになります。
(malloc()で確保した時のメモリブロックへのポインタではありません)
malloc()で確保した領域はそのままになっていますので、巷でよく言われる「メモリリーク」という不具合になります。
# 今時のまともなOSならそのままプログラムが終了するので問題にはなりませんけども。
>(2) キーボードから入力された文字列を、その長さ+1の配列変数をmalloc()で生成させて代入する。
は、(1)で入力を受けた配列をstrlen()なりで長さを取得、'\0'の分のメモリも込み(+1)でmalloc()で動的確保せよ。
ということかと。
代入するという記述がいまいち謎ですが。(1)で受けた内容をコピーしろ。ということでしょうかねぇ。(3)からすると意味が無いような気もしますが。
>(3) (2)で生成させた配列に、入力させた文字列を反転させたデータを入れる。
(1)の配列の内容を前後反転した状態で(2)で確保した領域に格納せよ。
ということでしょう。(おそらく問題のキモなので、どのようにやるのかは自分で考えてみてください)
# まあ、よくある問題なのでWeb検索とかで見つかるとは思いますけど。
>(4) 結果を出力する。
putchar()でもputs()でもprintf()でもいいでしょう。
# ただし、putchar()以外は文字列として正しく格納されているのが前提ですけど。
>(5) 生成したメモリを、free()で開放する。
そのまま…ですね。
前提として、(2)で受けたポインタが指している先が変わっていないこと…が前提になると思いますが。
# なのでポインタ変数pに対して操作は行わない方がよい。(やるならちゃんと元のアドレスを指すようにしましょう)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
nullと""、\\0とEOFの違いにつ...
-
%dなどの違い
-
C#でstringをポインタとして渡す
-
プログラムによく出てくるst...
-
C#で質問があります。
-
Perlでの文字列操作について
-
バイナリファイル中の日本語文...
-
C言語のプログラムについて
-
TCL言語で文字列検索方法を教え...
-
文字列にある特定文字の数
-
sprintf関数での文字列変換につ...
-
引用符と二重引用符
-
_tcscpy_s(wcscpy_s)の第二引数...
-
CSVファイルの「”」について
-
C++で入力した文字列から数字を...
-
char型配列の最大要素数
-
fgetsで配列に数字を入れる。
-
VB6.0でのバイナリデータの扱い...
-
Shift_JIS(16進)を文字に変換す...
-
関数から配列を返すには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WSH(VBS)でJSONの文字列を読み...
-
バイナリファイル中の日本語文...
-
nullと""、\\0とEOFの違いにつ...
-
C#でstringをポインタとして渡す
-
%dなどの違い
-
_tcscpy_s(wcscpy_s)の第二引数...
-
プログラムによく出てくるst...
-
TCL言語で文字列検索方法を教え...
-
構造体→文字列→構造体 をする方法
-
プログラム問題・・・
-
C++で入力した文字列から数字を...
-
16進数を2文字ずつ配列に格納し...
-
[C++]WCHARの1文字目しか表示で...
-
シリアル通信で0x00を送信した...
-
char型配列の最大要素数
-
VB6.0でのバイナリデータの扱い...
-
sprintf関数での文字列変換につ...
-
Excelシートを固定長のテキスト...
-
c#で他のアプリの文字入力フォ...
-
CSVファイルの「”」について
おすすめ情報