• 締切済み

ポインタ

字列2つを入力し,同じ文字列かどうかを判定するプログラム ポインタの操作で文字列の比較を実現する。 (ライブラリ関数 strcmp を仕様しない) 関数の中身が上手に実現出来ません。 文字列を指すポインタ変数 2 つを引数に取り,同じ文字列なら -1 を,異なる場合は先頭から一致した文字数 を返す関数 必ず,具体的な解答を提示して下さい。 char str__com(char *s,char *t,int count) { while(*s = *t != '\0'){ if(s != t){ return -1; } if(s == t){ count++; } {s++;t++;} } return -1; }

みんなの回答

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

ついでにいうと #2 の charは「-128~-1、0~127」しか表現できない も一般的には間違っています. char が符号付きか符号なしかは処理系に依存するので今のように処理系が分からない場合には決められないし, char の大きさについても「8ビット以上」と決められているだけ. とはいえ確かに char を返すのはおかしいよなぁ. ・同じ文字列なら -1 を返すというのが意味不明 ・なんで引数に count があるんだろう など, 仕様としてもおかしいけど.

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

#1の方の下記の文章は >>必ず,具体的な解答を提示して下さい。 >「具体的な」が「ソースを全部修正した回答」を期待していて、 >なおかつ「学校の課題」に対してそれをやったら丸投げ。 となっていますが、 これは、丸投げが禁止であるとは、言っていません。 質問者のこのような行為が丸投げに該当すると言っているだけです。 従って、全く正しい回答です。

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.3

>#2 >while(*s = *t != '\0'){ これは「tが指す場所の文字を、sが指す場所に代入して、代入した値が'\0'かどうか?」って処理なんだけど、理解してる? は間違い #1の方のアドバイスが正しい。 嘘を教えてはいけません。

  • chie65535
  • ベストアンサー率43% (8512/19351)
回答No.2

>char str__com(char *s,char *t,int count) charは「-128~-1、0~127」しか表現できないけど?一致した文字数が128文字とか、255文字だったらどうなるか、理解してる? >while(*s = *t != '\0'){ これは「tが指す場所の文字を、sが指す場所に代入して、代入した値が'\0'かどうか?」って処理なんだけど、理解してる? つまり「1番目の引数で渡した文字列が、2番目の引数で渡した文字列にコピーされる」んだけど? >if(s != t){ >if(s == t){ これは「文字列の中身じゃなくて、アドレスを比較してる」って処理なんだけど、理解してる? >count++; 「関数に渡されてきた引数は、呼び出し元で渡した変数のコピーなので、関数を抜ける寸前に消滅する」んだけど、理解してる? どうみても「わけもわからず、誰か他人が作った関数を、そのままコピペして質問してる」としか思えない。 もしこれが学校の課題なのなら、基本が全然ダメなんで、初学年の初学期からやり直した方が良いと思う。 >ANo.1 >なおかつ「学校の課題」に対してそれをやったら丸投げ。 「丸投げ」は禁止事項から外されたので何の問題もないけど? 新しい「禁止事項」と「サイトからのお知らせ」ちゃんと読んでますか? 回答者であっても「禁止事項」と「お知らせ」くらいは目を通すべきです。 (って感じで他人に指摘するのも禁止事項なんだけど、世の中「禁止されてると判ってても、書かなきゃ気付いてもらえない」から困ったもんだ。自分で気付くまで待ってるほど気が長い訳じゃないし)

回答No.1

>必ず,具体的な解答を提示して下さい。 「具体的な」が「ソースを全部修正した回答」を期待していて、 なおかつ「学校の課題」に対してそれをやったら丸投げ。 >同じ文字列なら -1 を,異なる場合は先頭から一致した文字数 を返す 同じでも、違っても戻り値としては「-1」しか返していない。 文字数を返す(と思われる)countは「値渡し」なので、文字数を返せない。「参照渡し」に変更する必要がある。(もしくは、戻り値で返す?) >while(*s = *t != '\0'){ は、処理の優先順位を示すと while(*s = (*t != '\0')) となる。 *tが'\0'と一致しているか同課の比較結果である「真/偽」を*sの指し示す場所に代入している処理になるため、条件としては間違い。 文字列の終端は'\0'なので、どちらか一方が終端になったらおしまい。 「*sが'\0'でなく」かつ「*tが'\0'でない」間の間処理する必要がある。 >if(s != t){ >if(s == t){ はsとtそれぞれの「アドレス」を比較している、比較する内容は「アドレスの指し示す内容」のため間違い。

関連するQ&A

  • ポインタ

    字列2つを入力し,同じ文字列かどうかを判定するプログラム ポインタの操作で文字列の比較を実現する。 (ライブラリ関数 strcmp を仕様しない) 関数の中身が上手に実現出来ません。 文字列を指すポインタ変数 2 つを引数に取り,同じ文字列なら -1 を,異なる場合は先頭から一致した文字数 を返す関数 while(*s = *t != '\0'){ if(s != t){ return -1; } if(s == t){ count++; } {s++;t++;} } return -1; }

  • プログラミング ポインタを使った文字列比較

    プログラミング ポインタを使った文字列比較 2つの文字列str1, str2を入力し,それらが等しければ0,等しくなければ1を返す関数str_compareを作り、返り値によって以下のように表示するプログラムを作れ。ただし,関数strcmpを使ってはならない。 文字列の入出力はmain関数で行い,関数str_compareの仮引数にはポインタ変数を宣言し,ポインタと間接演算子*を用いた処理を行うこと。 % ./a.out input str1 = Worldcup input str2 = Worldcup same strings % ./a.out input str1 = World input str2 = cup different strings この問題に私は次のようにプログラミングしました。 #include <stdio.h> #define MAX 100 int str_compare(char *, char *); main() { char str1[MAX], str2[MAX]; printf("input str1 = %s", str1); scanf("%s", str1); printf("input str2 = %s", str2); scanf("%s", str2); str_compare(str1, str2); if (str_compare(str1, str2) == 0) printf("same strings\n"); else if (str_compare(str1, str2) == 1) printf("different strings\n"); } int str_compare(char *s1, char *s2) { int i; for (i = 0; s1[i] != '\0'; i++) { if (s1[i] != s2[i]) { break; } } if (s1[i] == s2[i]) { return 0; } else { return 1; } } これで実行したところ、「input str1 =」の右のスペースが文字化け?してしまいます。(半角カタカナや記号が出る)ただ、その後に文字列を入力すると、正しく機能します。 これは何が悪いなのでしょうか、どなたか教えてください。

  • 文字列に関する関数

    現在C言語の勉強をしております。 そこで、以下の関数の作成について質問させてください。 【関数の仕様】 引数の文字列から、'-'(ハイフン)と'P'以降を排除した文字列を返す。 自分なりに作成してみたのですが、コンパイルで警告が出てしまう状況です・・・。 もっとスマートに書けるんだろうとは思っているんですが、精一杯でした・・・。 どなたか教えていただけませんでしょうか? char *getDelStr(char *str) { int len = strlen(str); int count; char targetStr[32]; for(count = 0; count < len; count++){ if(str[count] != 'P'){ if(str[count] != '-'){ strcat(targetStr,str[count]); } }else{ return targetStr; } } return str; } 以上、よろしくお願いいたします。

  • ポインタ

    質問なのですが、このソースのchar *str_copy(char *d, const char *s)関数内のchar *p=d;はなんで、*pにdを入れるか分かりません。それと、このdは、*dなのですか?どうして、while (*d++ = *s++) みたいに*dをつけないんですか?教えてください。宜しくお願いします。 #include <stdio.h> char *str_copy(char *d, const char *s) { char *p=d; while (*d++ = *s++) ; return (p); } int main(void) { char tmp[100]; char st1[100], st2[100],st3[100]; printf("文字列を入力してください:"); scanf("%s",tmp); str_copy(st1,str_copy(st2,tmp)); printf("文字列st1は%sです。\n", st1); printf("文字列st2は%sです。\n", st2); printf("文字列st3は%sです。\n", str_copy(st3,tmp)); return (0); }

  • 関数について

    char *str_char(const char *str, int c) { while (*str++) if (*str == c) return ((char *)str); return (NULL); } /*文字列strから文字cを検索し最初に存在する文字へのポインターを返す*/ 上記関数なのですが 5行目を return (str); にしてはなぜいけないのでしょうか。

  • 文字列中に含まれる文字の個数をカウントするプログラムについて…

    文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。 と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。 多分main関数の部分をちょっといじくればよいと思うのですが…。 どなたかアドバイスをお願いします。 #include <stdio.h> int count(const char *str, const char ch) { int cnt=0; while (*str!='\0') { if (*str==ch) cnt++; str++; } return cnt; } int main() { const char *str="hello,world!"; const ch='o'; int cnt; cnt=count(str, ch); printf("%s中に%cは%d個です\n", str, ch, cnt); return 0; }

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

       以下のコードで、DelHalfSpc() において引数 str は str++ でカウントされ、ループを抜けた時点では文字列の末尾を指しているはずですが、なぜ呼び出し側の main()の char str[] には正しい値が入るのでしょうか? char *DelHalfSpc(char *str) {   //char *dmy = str; → char * という型の変数 dmy の宣言   char *dmy, *Res;   Res = dmy = str; // Res は常に先頭アドレスを指す   while (*str != '\0') {     if ( *str != ' ' ) {       *dmy = *str;       dmy++;     }     str++;   }   //ループを抜けたこの時点で str は文字列の末尾を指しているはず   *dmy = '\0';   return Res;   //ここを return str とするとヌル文字列を返す } int main(void) {   char str[] = " 1 23 4 5";   printf("空白削除前:\"%s\"\n", str);   printf("空白削除後:\"%s\"\n", DelHalfSpc(str));   printf("str も変化:\"%s\"\n", str); //なぜ正しい結果が表示されるのか?   return 0; } 【結果】 ----------------------- 空白削除前:" 1 23 4 5" 空白削除後:"12345" str も変化:"12345"

  • C言語:小文字を大文字に変換する関数を作成

    C言語超初心者です。学校の課題で次のような問題が出されました。 ・問題・ 次に挙げる縛りに沿い、以下の関数とメイン関数を作り、処理結果を画面に作成しなさい。 char *tst(char *str) ・strの中の文字列も小文字を大文字に変換し、変換した文字列が格納されているchar *に返す。 ・引数strの中の文字列は受け取った状態で手を加えない。 ・関数内でmalloc関数を使用し、領域を確保して大文字に変換した文字列を格納しreturnでポインタを返す。 ・malloc関数を使用する。 ---------------------------------------------------------------------------------- 大文字に変換するには while(*str != '\0') { if(*str >= 'a' && *str <= 'z') { *str -= 'a'- 'A'; } ++str; } というのは分かったのですがここから何をすするか全く分かりません。初心者なのでなるべく分かりやすく教えてもらえると有難いです。 お願いします。

  • ポインタの問題です

    学校の課題である文字列をポインタを使って逆順に表示するというプログラムを作ったのですが、「問題で引数で与えられた文字列を逆順とする関数を作成せよ.ただし文字数が最大256文字であると仮定して良い.」ということなんですが、課題が求めている答えと自分が作ったプログラムがあっているか確認お願いします。 #include <stdio.h> void reverseWord(char *str); void main(void) { char *str = "sapporo"; char *p, *q; printf("元: %s\n", str); p = q = str; while (*q != '\0') q++; printf("逆順:"); while (q >= p) putchar(*q--); printf("\n"); } よろしくお願いします。

  • C言語 strcmp 半角スペースがあるとだめ?

    C言語 strcmp 半角スペースが文字列に含まれている場合 文字列の比較がうまくいきません。半角スペースがあると比較できないのでしょうか? プログラム //strcmp #include <stdio.h> #include <string.h> int main(void){ char input[256]; char str[] = "HelloWorld!";   //char str[] = "Hello World!";だとうまくいかない。 printf("%s\n>", str); scanf("%s", input); if ( strcmp(input, str) == 0){ printf("同じです。\n"); }else{ printf("違います。\n"); } return 0; }

専門家に質問してみよう