###発生している問題・エラーメッセージ
文字列を逆順にする関数を作成したのですが最後の文字の入れ替えができません。少しいじるとコアダンプと出てしまいます。どなたか解決法を教えてください。 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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア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
総合スコア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
総合スコア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
総合スコア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
総合スコア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総合スコア4070
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。