←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3479

Re:おしえてください
投稿者---ぽこ(2005/02/23 13:09:22)


>ある文字列があるとして、その文字列の中で一致する文字列を検索し
>そのなかで最長の文字列を表示するプログラムをおしえてください。

時間がないので途中まで。
最長の文字列を得るための事前準備までで投稿します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int strcmp2(const char ** s1, const char **s2);

int
main(void)
{
    char a[] = "i say sam what you are clever, but you say sam what you are clever";
    char **b;
    size_t len = strlen(a);
    int i;
    b = (char **) malloc(len * sizeof(char*));

    for(i = 0; i < len; ++i) {
        b[i] = &a[i];
    }

    qsort(b, len, sizeof(char*), strcmp2);

    for(i = 0; i < len; ++i) {
        printf("b[%d]:%s\n", i, b[i]);
    }

    return 0;
}

int strcmp2(const char ** s1, const char **s2)
{
    return strcmp(*s1, *s2);
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:おしえてください 3482 ぽこ 2005/02/23 20:32:41


No.3482

Re:おしえてください
投稿者---ぽこ(2005/02/23 20:32:41)


とりあえず最大長を求めるところまで作ってみました。
i say sam what you are clever, but you say sam what you are clever
に対する実行結果は
 say sam what you are clever

#先頭に空白文字が入ったり、"clever"が含まれたり、微妙に求める結果と違うなぁ。。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int strcmp2(const char ** s1, const char **s2);
int strmatch(const char * s1, const char * s2);

int
main(void)
{
    char a[] = "i say sam what you are clever, but you say sam what you are clever";
    char **b;
    size_t len = strlen(a);
    int i;
    int match_len;
    int max_match_len = 0;
    int max_match_idx = 0;

    b = (char **) malloc(len * sizeof(char*));

    for(i = 0; i < len; ++i) {
        b[i] = &a[i];
    }

    qsort(b, len, sizeof(char*), strcmp2);
    
    for(i = 0; i < len - 1; ++i) {
        match_len = strmatch(b[i], b[i+1]);
        if(max_match_len < match_len) {
            max_match_len = match_len;
            max_match_idx = i;
        }
    }

    printf("%*s\n", max_match_len, b[max_match_idx]);
    return 0;
}

int 
strcmp2(const char ** s1, const char **s2)
{
    return strcmp(*s1, *s2);
}

int 
strmatch(const char * s1, const char *s2)
{
    int i = 0;

    for(; *s1 && *s2 && *s1 == *s2; ++s1, ++s2, ++i){}

    return i;
}





この投稿にコメントする

削除パスワード

No.3483

Re:おしえてください
投稿者---かずま(2005/02/23 21:00:59)


> とりあえず最大長を求めるところまで作ってみました。
そのプログラムはバグがあります。文字列 a の最後にピリオドを付けて、

    char a[] = "i say sam what you are clever, but you say sam what you are clever.";

にしてみれば分かります。

また、VC++ ではコンパイルできますが、次のように gcc では警告が、
BC++ ではエラーになります。

C:\tmp>gcc a.c
a.c: In function `main':
a.c:25: warning: passing arg 4 of `qsort' from incompatible pointer type

C:\tmp>bcc32 a.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
a.c:
警告 W8012 a.c 21: 符号付き値と符号なし値の比較(関数 main )
エラー E2342 a.c 25: パラメータ '__fcmp' は int (*)(const void *,const void *)
型として定義されているので int (*)(const signed char * *,const signed char * *)
は渡せない(関数 main )
警告 W8012 a.c 27: 符号付き値と符号なし値の比較(関数 main )
*** 1 errors in Compile ***

C:\tmp>

----------------------------------------------------------------------
とりあえず、コンパイラが文句を言わないようにしてみました。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void *s1, const void *s2)
{
    return strcmp(*(char **)s1, *(char **)s2);
}

int match(const char *s1, const char *s2)
{
    int i;

    for (i = 0; s1[i] && s1[i] == s2[i]; i++) ;
    return i;
}

int main(void)
{
    static char a[] =
        "i say sam what you are clever, but you say sam what you are clever.";
    char *b[sizeof(a)];
    int i, j = 0, m = 0, n = strlen(a);

    for (i = 0; i < n; i++) b[i] = a + i;
    qsort(b, n, sizeof(*b), compare);
    for (i = 1; i < n; i++) {
        int k = match(b[i-1], b[i]);
        if (k > m) m = k, j = i;
    }
    printf("%.*s\n", m, b[j]);
    return 0;
}



この投稿にコメントする

削除パスワード

No.3485

Re:おしえてください
投稿者---ぽこ(2005/02/23 23:00:20)


>そのプログラムはバグがあります。

書式設定のバグですね。
ご指摘ありがとうございます。
#不十分なテストの方が問題かもしれませんが。。

>また、VC++ ではコンパイルできますが、次のように gcc では警告が、
>BC++ ではエラーになります。

これもご指摘ありがとうございます。
VC++でしか確認していませんでした。
ソースコードを投稿するときには最低2つのコンパイラで試すように
しようと思います。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity