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

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

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

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

Q&A

解決済

4回答

7088閲覧

C言語における文字列のスワップについて

redp

総合スコア49

C

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

0グッド

0クリップ

投稿2018/12/02 10:29

編集2018/12/02 10:31

実現したいこと

題の通りスワップをどのように実装するのがいいのかお聞きしたいです。皆様ならばどのように実装いたしますか?
私は以下のように考えました。
MAX_LENは決められたものとします。またコンパイル方法はコードの下のコメントのようにオプションをつけます。

現在の方法

C

1#include <stdio.h> 2 3#define MAX_LEN 5 4 5void copy(char *s1, char *s2, int n) 6{ 7 while (n--) { 8 if (!(*(s1++) = *(s2++))) 9 break; 10 } 11 while (n--) 12 *s1++ = '\0'; 13} 14 15void swap(char *s1, char *s2) 16{ 17 char tmp[MAX_LEN+1]; 18 copy(tmp, s1, MAX_LEN+1); 19 copy(s1, s2, MAX_LEN+1); 20 copy(s2, tmp, MAX_LEN+1); 21} 22 23int main(void) 24{ 25 char a[] = "Hello"; 26 char b[] = "World"; 27 printf("%s %s\n", a, b); 28 swap(a, b); 29 printf("%s %s\n", a, b); 30 return 0; 31} 32/* 実行 */ 33/* $ gcc -O -Wall -pedantic -ansi -o t test.c */ 34/* $ ./t */ 35/* Hello World 36 World Hello */

実行環境

gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

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

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

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

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

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

guest

回答4

0

ベストアンサー

皆様ならばどのように実装いたしますか?

そもそも、文字列のスワップをしなくていいように、ポインタのスワップで済ませるように検討すると思います。

投稿2018/12/02 10:49

otn

総合スコア84498

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

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

0

既に回答がついているように、ポインタのスワップが一番簡単ですが、

あえてするなら、 strcpy(), memcpy() とか使いますが、使ってはいけない?
また、余分なメモリ使いたくなければ、一文字ずつ、swap ですね。
(もっとも今時、この方法が効率良いかは不明)

投稿2018/12/02 11:33

pepperleaf

総合スコア6383

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

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

0

こんな漢字で、

C

1#include <stdio.h> 2 3#define MAX_LEN 5 4 5void strnxor(char *s1, const char *s2, size_t n) { 6 while (n--) { // 終端の'\0'は無視:-) 7 *(s1++) ^= *(s2++); 8 } 9} 10 11void strnswap(char *s1, char *s2, size_t n) { 12 strnxor(s1, s2, n); 13 strnxor(s2, s1, n); 14 strnxor(s1, s2, n); 15} 16 17int main(void) { 18 char a[] = "Hello"; 19 char b[] = "World"; 20 printf("%s %s\n", a, b); 21 strnswap(a, b, MAX_LEN + 1); 22 printf("%s %s\n", a, b); 23 return 0; 24}

投稿2018/12/02 12:27

hichon

総合スコア5737

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

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

0

これが最適解かわかりませんがポインタの交換で対応いたしました。

C

1#include <stdio.h> 2 3#define MAX_LEN 5 4 5void swap(char **s1, char **s2) 6{ 7 char *tmp; 8 tmp = *s1; 9 *s1 = *s2; 10 *s2 = tmp; 11} 12 13int main(void) 14{ 15 char *a = "Hello"; 16 char *b = "World"; 17 printf("%s %s\n", a, b); 18 swap(&a, &b); 19 printf("%s %s\n", a, b); 20 return 0; 21} 22/* 実行 */ 23/* $ gcc -O -Wall -pedantic -ansi -o t test.c */ 24/* $ ./t */

投稿2018/12/02 12:17

編集2018/12/02 12:18
redp

総合スコア49

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問