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

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

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

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

Q&A

解決済

2回答

3934閲覧

文字列を逆順にコピーするには

party_0621

総合スコア9

C

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

0グッド

0クリップ

投稿2020/08/17 14:47

下のような感じでプログラムをプログラムを書きました。
このプログラムで、文字列s0で渡された文字列を逆順に配列s1にコピーにするにはどうすればいいのかわからないです。
どのように変えたら逆になるのか教えてもらえたらありがたいです。
回答お願いします!!

#include <stdio.h> void string_revcopy(const char[], int, char[], int); int str_length(const char[]); int main(void) { char str1[]="abcdefghijklmn"; char str2[10]={'\0'}; int len1, len2; len1 = str_length(str1); len2 = (int)(sizeof(str2)/sizeof(str2[0])); string_revcopy(str1, len1, str2, len2); printf("str1の文字列:%s\n", str1); printf("str2の文字列:%s\n", str2); return 0; } void string_revcopy(const char s0[], int n, char s1[], int m) { int num; for( int i = 0; i < m; i++){ s1[i] = '\0'; } if( n > m - 1){ num = m - 1; } else{ num = n; } for(int i = 0; i < num; i++){ s1[i] = s0[i]; } } int str_length(const char s[]) { int len = 0; while(s[len]){ len++; } return len; }

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

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

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

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

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

kazuma-s

2020/08/18 04:08

char str2[10]={'\0'}; の 10 はどこから来たのですか?
guest

回答2

0

ベストアンサー

party_0621さん

文字列s0で渡された文字列を逆順に配列s1にコピーにするにはどうすればいいのかわからないです。

下記のような方法で2つのカウンタ変数をそれぞれ逆方向に進めながら取得できます。

c

1int foward,backword; 2 3for(int i=0; i<size; i++){ 4 foward = i;// 順方向に進むカウンタ変数 5 backword = size - i;// 逆方向へ進むカウンタ変数 6}

これを踏まえて
元コードを尊重するなら
下記のように書ば良いかと思われます。

c

1#include <stdio.h> 2 3void string_revcopy(const char[], int, char[], int); 4int str_length(const char[]); 5 6int main(void) 7{ 8 char str1[]="abcdefghijklmn"; 9 char str2[15]={'\0'};// str1の要素数以上(終端文字も含む)でなければ全文表示できない 10 int len1, len2; 11 12 len1 = str_length(str1); 13 len2 = (int)(sizeof(str2)/sizeof(str2[0])); 14 15 string_revcopy(str1, len1, str2, len2); 16 17 printf("str1の文字列:%s\n", str1); 18 printf("str2の文字列:%s\n", str2); 19 20 return 0; 21} 22 23void string_revcopy(const char s0[], int n, char s1[], int m) 24{ 25 int n_null_index = n-1;// s0の終端文字の位置 26 int m_null_index = m-1;// s1の終端文字の位置 27 28 for(int i=0; i<m_null_index; i++) s1[i] = s0[(n_null_index-1)-i]; 29 30 if(n>=m)s1[m_null_index] = '\0'; 31 else s1[n_null_index] = '\0'; 32} 33 34int str_length(const char s[]) 35{ 36 int len = 0; 37 38 while(s[len]){ 39 len++; 40 } 41 42 ++len;// 終端文字もカウント 43 44 return len; 45}

見当違いな回答でしたら申し訳ございません。

投稿2020/08/17 19:59

編集2020/08/17 20:07
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

トランプのカードを並び替えるイメージで行けます。
例えば、5枚のカードがあるとして上の段から下の段に、順番を逆に動かすには
上の段の1枚目をとって、下の段の5枚目に置く
上の段の2枚目をとって、下の段の4枚目に置く
上の段の3枚目をとって、下の段の3枚目に置く

と上の段の終わりまで繰り返せばOKです。

投稿2020/08/17 15:09

amiya

総合スコア1218

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問