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

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

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

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

Q&A

解決済

6回答

19255閲覧

c言語 文字列を逆順にして出力する

maikeru

総合スコア68

C

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

0グッド

1クリップ

投稿2017/11/19 12:11

###発生している問題・エラーメッセージ

文字列を逆順にする関数を作成したのですが最後の文字の入れ替えができません。少しいじるとコアダンプと出てしまいます。どなたか解決法を教えてください。 strは文字列、nは文字列strの長さです。

###該当のソースコード

c

1void rev(char *str,int n) 2{ 3 4 char *p=(char*)malloc(sizeof(char)*(n+1)); 5 6 strcpy(p,str); 7 8 while(*(p+1)!='\0'){ 9 p++; 10 11 } 12 13 while(*(str+1)!='\0'){ 14 *str=*p; 15 str++; 16 p--; 17 } 18 free(p); 19}

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

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

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

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

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

guest

回答6

0

文字列について、ヌル文字がどのような役割を果たしているのかご存知でしょうか。
C言語では文字列はchar型変数の配列として表現されますが、その最終要素がヌルなのです。

先頭から順にたどる際にヌル文字を判定に用いるのはこのためです。
一方、逆にたどる際には、ヌル文字があることは期待できない(というか、全くない)です。


おそらく関数を実装する課題/設問であると推察します。
前もって文字列長が与えられるのですから、素直にfor文で一文字一文字見ればよいです。
mallocもstrcpyも必要ありません。

参考までに、順方向に出力するサンプルです。

C

1void normal(char* str, int n) { 2 for(int i = 0; i < n; i++) { 3 printf("%c", str[i]); 4 } 5 printf("\n"); 6}

投稿2017/11/19 12:20

編集2017/11/19 12:24
LouiS0616

総合スコア35658

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

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

0

malloc使わない別解

C

1void swap(char* x, char* y) { 2 char t = *x; 3 *x = *y; 4 *y = t; 5} 6 7void iter_rev(char* first, char* last) { 8 while (first != last && first != --last) { 9 swap(first++, last); 10 } 11} 12 13void rev(char* str, int n) { 14 iter_rev(str, str+n); 15}

投稿2017/11/19 23:31

episteme

総合スコア16614

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

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

0

ベストアンサー

こちらでどうでしょうか。

#include <stdio.h> void reverse(char* str, int n) { for(int i=n-1; i>0; i--){ printf("%c",str[i-1]); } printf("\n"); } int main(){ char msg[]= "This is a pen"; int size = sizeof(msg)/sizeof(msg[0]); reverse(msg, size); }

投稿2018/11/02 05:42

YOshim

総合スコア1085

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

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

0

なんかパズルみたいですね。逆順回しはループや++を使わないで再帰の事例になります。

C

1#include <stdio.h> 2#include <string.h> 3 4void _rev(char *new, char *base, int n) 5{ 6 printf("enter:%s %d\n", base, n); 7 if (n == 1) { 8 printf(":=%c\n", base[0]); 9 new[0] = base[0]; 10 return; 11 } 12 _rev(new, base + 1, n - 1); 13 new[n - 1] = base[0]; 14 new[n] = '\0'; 15 printf("@=%c, [%s]\n", base[0], new); 16} 17 18void rev(char *str, int n) 19{ 20 char *new = strdup(str); 21 printf("IN:%s\n", str); 22 _rev(new, str, n); 23 strcpy(str, new); 24 printf("OUT:%s\n", str); 25}; 26 27int main(int ac, char **av) 28{ 29 if (ac > 1) { 30 rev(av[1], strlen(av[1])); 31 } 32 else printf("usage: %s string\n", av[0]); 33 return 0; 34}

投稿2018/11/01 18:47

ahidaka

総合スコア391

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

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

0

C

1void rev(char *str, int n) 2{ 3 char *p=(char*)malloc(n+1); 4 int len, i; 5 6 memcpy(p, str, n); 7 len = strlen(p); 8 9 memset(str, 0, n); 10 i = 0; 11 12 while (len >= 0) { 13 str[i++] = p[len--]; 14 } 15 free(p); 16}

strlen()で文字列の長さを求め、whileで長さの回数コピーするやり方です。

rev(str, sizeof(str)); と使うのかな?
strが文字コードでフルになっている場合(終端にNULLが無い場合)も考慮しています。

投稿2017/11/21 07:34

uroncha

総合スコア54

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

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

0

while文の最後の部分を修正しました。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4void rev(char *str,int n) 5{ 6 7 char *p=(char*)malloc(sizeof(char)*(n+1)); 8 9 strcpy(p,str); 10 11 while(*(p+1)!='\0'){ 12 p++; 13 } 14 15 while(*(str+1)!='\0'){ 16 *str=*p; 17 str++; 18 p--; 19 } 20 *str=*p; 21 22 free(p); 23} 24 25void main(void){ 26 char str[40]={"abcdefghijklmnopqrstuvwxyz"}; 27 printf("%s\n",str); 28 rev(str, strlen(str)); 29 printf("%s\n",str); 30}

malloc使わないサンプル

#include <stdio.h> #include <string.h> void rev(char *str,int n) { int i; char c; for (i=0;i<n/2;i++){ c=*(str+i); *(str+i)=*(str+n-i-1); *(str+n-i-1)=c; } } void main(void){ char str[40]={"abcdefghijklmnopqrstuvwxyz"}; printf("%s\n",str); rev(str, strlen(str)); printf("%s\n",str); }

投稿2017/11/19 18:23

編集2017/11/19 22:28
A.Ichi

総合スコア4070

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問