• 締切済み

C言語について

2つの文字列を入力して別の文字列にコピーするプログラムをつくっているのですが、どこが間違っているのでしょうか?教えていただけませんか? /*文字列連結*/ void *my_stract(char*, char*, char*); void main(void) { char bun1[100],bun2[100],bun3[200]; printf("文字列1を入力してください\n"); gets(bun1); printf("文字列2を入力してください\n"); gets(bun2); my_stract(bun1,bun2,bun3); puts(bun3); } char *my_stract(char *str3, char *str2, char *str1) { char *p1, *p2, *p3; p1=str1; p2=str2; p3=str3; while(*p1) { *p3=*p1; p1++; p3++; } while(*p2) { *p3=*p2; p2++; p3++; } *p3='\0'; return str3; }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

「いくらなんでもそれはないだろ」的に巨大な間違いがあるなら, 突っ込んでいいと思いますけどね>#5. とよそ向けに書いておくけど, 今までの回答で言われたことを理解できてる?

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.5

#1, #2 でもう説明してありますけど >2つの文字列を入力して別の文字列にコピーするプログラムをつくっているのですが、どこが間違っているのでしょうか?教えていただけませんか? >char *my_stract(char *str3, char *str2, char *str1) この関数の説明を書いてみてください。 >my_stract(bun1,bun2,bun3); その書いた説明の使い方に合っていますか。 #3のコードにも突っ込み入れたい・・・

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

あえて突っ込ませてもらいます>#3. i < MAX_SRC という比較が全く意味不明. あと, 他の関数にあわせて dst を第1引数においた方がいいとか, src は const 付けてあげた方が親切だろうとか, いくつかありますけどね.

回答No.3

どこから突っ込めばいいやら… bun1, bun2, bun3はbuf1, buf2, buf3のスペルミスでは… my_stractもmy_strcatのスペルミスでは… それはいいとして… my_stractの一行目から、 char *p1, *p2, *p3; p1=str1; p2=str2; p3=str3; は要りません while(*p1)は、p1がNULL終端してるのかも調べないで回しているので確認する必要があります。while(*p2)も同様 さらに、*p3は100しか容量がないのにただ*p1と*p2をくっつけたら容量をオーバーします。 また、これは定石なのですが、出力が文字列の場合は、戻り値ではなく引数で返るようにするべきです。 ですから、これらを実現するためには、 int my_strcat( char src1[], size_t lenSrc1, char stc2[], size_t lenSrc2, char[] dst, sizeof maxDst ); という形の関数とし、1つ目の文字列、その長さ、2つ目の文字列、その長さ、出力先、その最大長 を渡して、 戻り値には正常終了(例えば0)、出力先の長さが足りなかった(例えば1)、などとするべきです。 (標準のstrcatではこの安全機構がないのでミスを生みやすいです) 参考に、私が書いたソースを載せておきます。 (突貫工事なのでアホなことしてるかもしれません。 丸写しはやめてください。) http://ideone.com/lXoPII

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>char bun1[100],bun2[100],bun3[200]; >my_stract(bun1,bun2,bun3); で、 >char *my_stract(char *str3, char *str2, char *str1) >p1=str1; >while(*p1) おめでとう。かなり高い確率でバッファオーバーランを実現だ。 mainで確保している【未初期化のbun3】から'\0'が見つかるまで突っ走るぜ!! 俺様を止められるのはOSによる強制停止だげだぜ!ヒッハー!! ローカル変数はちゃんと初期化しましょうね。 あと、変数名はもう少し気を遣いましょうね。 >while(*p1) >{ > *p3=*p1; > p1++; > p3++; >} 未初期化のbun3の内容を >printf("文字列1を入力してください\n"); gets(bun1); で入力したbun1に対して上書きしていくコードです。 変数名をよ~~っく確認してください。 # char *my_stract(char *str3, char *str2, char *str1) # の並びで第1引数の変数名が「str3」となっている辺りから誤解がスタートするんです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

my_stract(bun1,bun2,bun3); のところ, 何をしてるの?

関連するQ&A

  • C言語

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。考えたのですが、分かりません。(コンパイルエラーです。)教えてください。宜しくお願いします。#include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

  • C言語に詳しい方お願い致しいます

    文字列Aから文字列Bを除いた結果を表示するプログラムなのですが 一ヶ所分からない部分があります。 #include <stdio.h> #include <string.h> int main(void){  char str1[] = "abcdefg";  char str2[] = "cde";  char str3[128] = "";  char *p1 = str1, *p2;  size_t len;  len = strlen(str2);  while((p2 = strstr(p1,str2)) != NULL) {   strncat(str3,p1,p2 - p1);   p1 = p2 + len;   printf("----\n");   printf("p2=%s\n", p2);   printf("str3=%s\n", str3);   printf("p1=%s\n", p1);  }  strcat(str3,p1);  printf("%s\n",str3);  return 0; } while文中の p1 = p2 + len; なのですが、何故これでp1の内容が「fg」になるのでしょう。

  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

  • C言語について教えてください。

    #include <string.h> #include <stdio.h> void print_all_char(char *str) { while(*str! = '\0') { printf("%c\n", *str); str++; } } int main(void) { char astr[5]; char *pstr; strcpy(astr, "ABCD"); pstr = "EFGHI"; puts("「配列で実現する文字列」を表示する"); puts(astr); puts("「配列で実現する文字列」のすべての文字を表示する"); print_all_char(astr); puts("「ポインタで実現する文字列」を表示する"); puts(pstr); puts("「ポインタで実現する文字列」のすべての文字を表示する"); print_all_char(pstr); return 0; } 自分でつくった上のプログラムではエラーが発生します。 なぜだか分かりません。教えてください。 ちなみに、実行結果は 「配列で実現する文字列」を表示する ABCD 「配列で実現する文字列」のすべての文字を表示する A B C D 「ポインタで実現する文字列」を表示する EFGHI 「ポインタで実現する文字列」のすべての文字を表示する E F G H I のようにしたいです。 よろしくお願いします。

  • C言語のポインタと配列について

    下のコードについて2つ質問があります。 (1) char *p; p = str; ならわかるのですが、なぜ型が違う char *p = str; のような代入がOKなのでしょうか。文字列をコピーするときの   *p = *str; と比較して、とても違和感があります。  str は引数で受けた文字列の先頭アドレス。 (2)   char *str;   str = " 1 23 4 5"; と   char str[] = " 1 23 4 5"; との違いがよくわかりません。 #include <stdio.h> #include <ctype.h> void TrimSpace(char *str) {   char *p = str;        // (1)型が違うのになぜこんな代入をするのか?      while (*str != '\0') {     if ( !isspace(*str) ) {       *p = *str;      // この代入は自然       p++;     }     str++;   }   *p = '\0'; } int main(void) {      //char *str;   //str = " 1 23 4 5";     (2)これでは空白を詰めた後の文字列が表示されないのはなぜか?      char str[] = " 1 23 4 5"; //これで OK   printf("空白を詰める前:\"%s\"\n", str);   TrimSpace(str);   printf("空白を詰めた後:\"%s\"\n", str);   return 0; }

  • C言語 ポインタと配列

    #include <stdio.h> /* scanf("%c", &search); ではなく scanf(" %c", &search); であることに注意する */ char *str_chr(const char *str, char c) { char *find; find = NULL; do { if(*str == c) { find = (char*)str; break; } } while(*str++); return(find); } int main(void) { char str[100] = {0}; char search; char *find; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &search); find = str_chr(str, search); if(find == NULL) { puts("検索した文字は見つかりませんでした。"); } else { printf("検索した文字 %c は\"%p\"にあります。\n", *find , find); } return(0); } このコードのfind = (char*)str;の (char*)str;の部分がどうなっているのかわかりません。 あとこのfindというのは&find[0]という解釈でいいでしょうか? 教えてくださいm(_ _ )m

  • C言語の問題があと少しでわからないのですが

    学校の課題に取り組んで分からないことろが出てきました。問題は以下のものです。 問題13 任意の文字列を(str)を入力して、削除文字を入力させ、strから削除文字を削除して表示しなさい。 出力例:str = abcd 削除文字:c →結果:abd というものです。 途中まで自分で考え ------------------------------------------------------------------------------------------------------------------- #include <stdio.h> void rmv(char *str, char c); int main(void) { char str[80]; int c; printf("文字列入力 : "); fgets(str, 80, stdin); printf("削除文字入力 : "); c = getchar(); void rmv(str, (char)c); printf("削除後文字列 : %s", str); return 0; } void rmv(char *str, char c) { while(*str) { if(*str == c) { while(*str) { *str = *(str + 1); ++str; } } ++str; } *str = '\0'; } --------------------------------------------------------------------------------------------------------- としましたが削除文字判定と文字つめのループ用に同じポインタを使っているので文字が一文字しか消えないと言われました。 解決方法にrmv関数内で別のポインタを用意し、if文内でコピー(例 p =str;)し次のwhile文内でこのポインタを用いて判定するというヒントを貰いましたが。自分で組んでいて上手く動きません。 どのように処理をしていけばいいでしょうか。 超初心者なので説明も付けていただくと有難いです。

  • C言語ののポインタについて

    「明解C言語 入門編」p262の演習11-4についての質問です。 このサイトも参考にしてみて、 入力された文字の大文字小文字を反転するプログラムをvimで書いてみたのですが #include <stdio.h> #include <ctype.h> void str_toupper(char *str) { while (*str = toupper(*str)) { *str++; } } void str_tolower(char *str) { while(*str = tolower(*str)) { *str++; } } int main(void) { char str[100]; printf("文字列を入力してください:"); scanf("%s", str); str_toupper(str); printf("大文字:%s\n", str); str_tolower(str); printf("小文字:%s\n", str); return(0); } clangを用いてコンパイルすると4warnings generatedと出ます。 ------------------------------------------------------------ ex11-4.c:6:13: note: use '==' to turn this assignment into an equality comparison while(*str = toupper(*str)){ ^ ------------------------------------------------------------- こんなのや ---------------------------------------- ex11-4.c:7:3: warning: expression result unused [-Wunused-value] *str++; ^~~~~~ ---------------------------------------------------- といった警告が表示されます。 どこをどう訂正すれば良いのでしょうか。 よろしくお願いします。

  • strrchrについて【C言語】

    このプログラムのp-strの部分は具体的にはどの様な計算をしているのでしょうか?? (xx-xxというふうに) あとint c は char c としなくても良いのでしょうか?? どなたかご教授よろしくお願いいたします<(_ _)> #include <string.h> #include <stdio.h> int main(void) { char str[]= "abcdefghijklmnabcdefghijklmn", *p; int c; printf("検索文字を入力してください。"); c = getchar(); p = strrchr(str, c); if (p != NULL) { printf("%cは文字列の%d番目にあります。\n", c, p-str); printf("以降の文字列は%sです。\n", p); } else printf("%cは見つかりませんでした\n", c); return 0; } 【実行結果例】 検索文字を入力してください。d dは文字列の17番目にあります。 以降の文字列はdefghijklmnです。

  • C言語 ポインタ エラー

    文字列を入力後改行して入力した文字列を出力したいのですが、エラーがでます。 ハンドルされない例外が 0xFEFEFEFE (helloworld.exe) で発生しました: 0xC00001A5: 無効な例外ハンドラー ルーチンが検出されました。 (パラメーター: 0x00000003)。 調べてみましたが、理解できません 何卒よろしくお願いします。 #include <stdio.h> void put_string(const char *str) { while (*str) putchar(*str++); } int main(void) { char str[100]; printf("文字列を入力してください"); scanf_s("%s", str); put_string(str); putchar('\n'); return(0); }

専門家に質問してみよう