質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

5555閲覧

C言語 文字列の操作に関する問題 配列の並びの反転

aya0

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/02/26 00:40

編集2020/02/27 01:12

問題
文字列sの文字の並びを反転する関数を作成せよ。
void rev_string(char s[]){/・・・/}
たとえば、sに"SEC"を受け取ったら、その配列を"CES"に更新すること。

下記は私が考えた、この問題に対するプログラムです。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void rev_string(char s[]) { int i = 0; int len = 0; while (s[i]) { len++; } for (i = 0; i < len; i++) { s[i] = s[len -1 - i]; } printf("%s", s); return 0; } int main(void) { char str[128]; printf("文字列を入力してください:\n"); scanf("%s", str); rev_string(str); return 0; }

このプログラムを実行すると入力しただけでプログラムが止まってしまいます。
なぜ、そのようになるのか理由が知りたいです。
よろしくお願いします。

下記は解決後のコードです。

改訂1

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void rev_string(char s[]) { char temp[128]; int i = 0; int len = 0; len = strlen(s); for (i = 0; i <(len / 2); i++) { temp[i] = s[i]; s[i] = s[len - 1 - i]; } if ((len % 2) == 0) { for (i = (len / 2); i < len; i++) { s[i] = temp[len - 1 - i]; } } else { for (i = (len / 2) + 1; i < len; i++) { s[i] = temp[len - 1 - i]; } } } int main(void) { char str[128]; printf("文字列を入力してください:\n"); scanf("%s", str); rev_string(str); printf("%s", str); return 0; }

改訂2(改訂1をシンプルにしました)

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void rev_string(char s[]) { int i = 0; int len = 0; char temp; len = strlen(s); for (i = 0; i <(len / 2); i++) { temp = s[i]; s[i] = s[len - 1 - i]; s[len - 1 - i] = temp; } } int main(void) { char str[128]; printf("文字列を入力してください:\n"); scanf("%s", str); rev_string(str); printf("%s", str); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

解決済みなら、できたコードを質問に追加して、見せてもらえませんか?

「文字列sの文字の並びを反転して、それを表示するする関数を作成せよ。」
とはなっていないので、rev_string の中で表示をしてはいけないと思います。
また、void rev_string ですから、return 0; を付けてはいけません。

参考にならないコード

C

1#include <stdio.h> 2 3int revstr(char *s, int i) 4{ 5 char c = s[i]; 6 return c ? i = revstr(s, i + 1), s[i] = c, i + 1 : 0; 7} 8 9void rev_string(char s[]) { revstr(s, 0); } 10 11int main(void) 12{ 13 char str[128]; 14 puts("文字列を入力してください:"); 15 scanf("%127s", str); 16 rev_string(str); 17 puts(str); 18}

別解

C

1#include <stdio.h> // puts, scanf 2#include <string.h> // strlen 3 4void rev_string(char s[]) 5{ 6 for (int i = 0, j = strlen(s); i < --j; i++) { 7 char t = s[i]; 8 s[i] = s[j]; 9 s[j] = t; 10 } 11} 12 13int main(void) 14{ 15 char str[128]; 16 puts("文字列を入力してください:"); 17 scanf("%127s", str); 18 rev_string(str); 19 puts(str); 20}

投稿2020/02/26 15:27

編集2020/02/27 02:08
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aya0

2020/02/27 00:43 編集

ご指摘ありがとうございます! kazuma-sさんがご指摘頂いた箇所も訂正して、質問に訂正後のコードを追加しました。
aya0

2020/02/27 04:17

別解のコードありがとうございます! とても、シンプルで見やすいコードですね! 参考にします!
guest

0

すこし文字列が長くても反転する様にしてみました

c

1#include <stdio.h> 2#include <string.h> 3 4void rev_string(char s[]) 5{ 6 int i = 0; 7 int len = 0; 8 char w; 9 10 len = strlen(s); 11 12 for (i = 0; i < (len / 2); i++) { 13 w=s[i]; 14 s[i] = s[len -1 - i]; 15 s[len -1 - i] = w; 16 } 17 printf("%s\n", s); 18 19} 20 21int main(void) 22{ 23 char str[128]; 24 memset(str,'\0',128); 25 printf("文字列を入力してください:\n"); 26 scanf("%s", str); 27 28 rev_string(str); 29 30 return 0; 31}

tempに反転セットするにしてみました

c

1#include <stdio.h> 2#include <string.h> 3 4void rev_string(char s[]) 5{ 6 char temp[128]; 7 int i = 0; 8 int len = 0; 9 10 len = strlen(s); 11 12 memset(temp,'\0',128); 13 for (i = 0; i < len; i++) { 14 temp[len - i - 1] = s[i]; 15 } 16 strcpy(s, temp); 17 18} 19 20int main(void) 21{ 22 char str[128]; 23 24 printf("文字列を入力してください:\n"); 25 scanf("%s", str); 26 27 rev_string(str); 28 printf("%s", str); 29 30 return 0; 31}

投稿2020/02/26 04:36

編集2020/02/27 01:19
amura

総合スコア333

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aya0

2020/02/27 01:01

コードありがとうございます! 私はif文を使って処理してたのですが、 w=s[i]; s[i] = s[len -1 - i]; s[len -1 - i] = w; こちらの方がコードがシンプルでいいですね! 参考にします!
aya0

2020/02/27 04:30

別解のコードありがとうございます! そのようなやり方もあったのですね! 参考にします!
guest

0

ベストアンサー

while(s[i])のループブロックが無限ループします。
⇒iを加算し忘れていますよ。
そもそも文字列の長さを取得するなら、
len = strlen(s);
で良いです。

scanfで取得する文字列長が127を超えるとバッファオーバーフローが発生し得ます。

また、文字列の入れ替えですが、このロジックでは配列の中央から先は既に移動済の文字が代入されてしまいます。

投稿2020/02/26 00:50

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/02/26 00:52

(そこまで求められることはないとは思いますが)1バイト文字への対応だけでいいのかという仕様も気になります。
aya0

2020/02/26 01:37

ありがとうございます! すごく助かりました!
guest

0

まずは気づいたところだけですが、

C

1 while (s[i]) { 2 len++; 3 }

このループでlenを変えてもs[i]は変化しないので、無限ループとなってしまっています。

投稿2020/02/26 00:44

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aya0

2020/02/26 01:37

ありがとうございます! すごく助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問