1

文字列内で abc からの一連の文字を検索する関数を作成する必要があります。それらを削除し、シーケンスの最初と最後の 2 つだけを残します。たとえば、入力文字列が次の場合: dabcemoqmnopqrrtaduvwxaz 出力は次のようになります: da-cemoqm-rrtadu-xaz

これは私が書いた関数です:しかし、それは動作しません...

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

main()
{
    char str[100];
    printf("please enter a String");
    scanf ("%c", &str);

    for (int i=o; i< strlen(str); i++)
    {
        count=0;
        while(str[i+1]= str[i]+1)
        {
            if (count==0 || str[i+2]!=str[i]+1)
                str[i+1]="-";
            else
                str[i+1]="";
                count++;
        }

        printf("the correct String is:" %c, str);
    }
}
4

2 に答える 2

2

テスト実行:

Please enter a string: kswa0123456789abcdeffABCDEFQRSTUVWXYZaaaab
Input: kswa0123456789abcdeffABCDEFQRSTUVWXYZaaaab
Output: kswa0-9a-ffA-FQ-Zaaaab

Please enter a string: dabcemoqmnopqrrtaduvwxaz
Input: dabcemoqmnopqrrtaduvwxaz
Output: da-cemoqm-rrtadu-xaz

作業コード:

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

int main(void)
{
    char str[100];

    //strcpy(str, "dabcemoqmnopqrrtaduvwxaz");
    printf("Please enter a string: ");
    if (scanf("%99s", str) != 1)
        return(1);
    printf("Input: %s\n", str);

    int len = strlen(str);
    char *dst = str;
    int j = 0;

    for (int i = 0; i < len; i++)
    {
        int k;
        for (k = i; k < len; k++)
        {
            //printf("cmp %d (%c) and %d (%c)\n", k, str[k], k+1, str[k+1]);
            if (str[k+1] != str[k]+1)
                break;
        }
        if (k >= i+2)
        {
            //printf("squish %d (%c) to %d (%c)\n", i, str[i], k, str[k]);
            dst[j++] = str[i];
            dst[j++] = '-';
            dst[j++] = str[k];
            i = k;
        }
        else
            dst[j++] = str[i];
    }
    dst[j] = '\0';

    printf("Output: %s\n", str);
    return(0);
}
于 2013-03-31T04:55:47.007 に答える
1

簡単に言えば、関数はあなたが望むことをしません。それか、私があなたの意図をひどく誤解したかのどちらかです。

また、いくつかのエラー、または少なくとも疑わしいステートメントがあります。

scanf ("%c", &str); // This reads a single character, not a string
int i=o             // Did you want a zero here?
str[i+1]="-";       // You probably meant '-', single quotes
str[i+1]= str[i]+1  // Eh? Did you mean `==`? Why?

コードがどのように機能するはずなのか、本当に理解できません。修正方法もわかりません。ただし、別の方向に向けることはできます。

要件を理解していれば、出力文字列は入力文字列よりも短い可能性があります。その場で(入力の上で)作業すると、物事が複雑になるだけです。

入力文字列と出力文字列を使用するようにアルゴリズムを書き直してみてください。文字列が条件を満たしているかどうかに応じて、文字列から別の文字列に文字をコピーします。これに似たもの:

j = 0;
for (int i = 0; i < strlen(input); i++)
    if (condition(input, i))
        output[j++] = input[i]

「条件」はあいまいで、スニペットで強制されているとは思いません。is_abcおそらく、部分文字列がアルファベットに含まれているかどうかを知らせるヘルパー関数を書きたくなるでしょう。

tl;drこれをよく考える必要があります。場合によっては、学習教材を確認してください。

于 2013-03-30T10:46:37.227 に答える