0

ランダムな大文字の文字列を生成し、ユーザーからの文字とともに大文字のユーザー入力を取得するプログラムを作成しています。ランダム文字列内のユーザー入力文字のインスタンスについては、その文字をユーザーが入力した文字に置き換えます。

たとえば、s1 = {BDHFKYL} s2 = {YEIGH} c = '*'

出力 = BD*FK*L

文字を置き換えたい文字を入力するようにユーザーに求める機能を追加するまで、プログラムは正しく機能していました。

出力は次のとおりです。

Please enter at least 2 capital letters and a maximum of 20.
HDJSHDSHDDS
HDJSHDSHDDS
Enter a character to replace occuring letters.
*
NWLRBBMQB
Would you like to enter another string?

コードは次のとおりです。

void fillS1(char x[]);

void fillS2(char x[], char y[], char z);

void strFilter(char a[], char b[], char c);

int main(int argc, const char * argv[])
{
 char s1[42];
 char s2[22];
 char x = 0;

 fillS2(s2, s1, x);

 return 0;
}

void fillS1(char x[])
{
 for (int i = 0; i < 40; i++)
     x[i] = 'A' + random() % 26;
 x[40] = (char)0;
}

void fillS2(char x[], char y[], char z){

 char loopContinue = 0;

 do {

 int i = 0;
 int capitalLetterCheck = 0;

 printf("Please enter at least 2 capital letters and a maximum of 20.\n");
 while (( x[i] = getchar()) != '\n' ) {

    i++;

     }

 x[i] = '\0';

 if (i < 3) {
    printf("You need at least two letters\n");
 }

 else if (i > 21){
    printf("You cannot have more than twenty letters\n");
}


for (i = 0; i < 20; i++) {
        if ((x[i] >= 'a') && (x[i] <= 'z')) {
            printf("You many only have capital letters.\n");
            capitalLetterCheck = 2;
        }
    }


if (capitalLetterCheck != 2) {
    for (i = 0; i < 20; i++) {
        if ((x[i] >= 'A') && (x[i] <= 'Z')) {
            puts(x);

            fillS1(y);

            printf("Enter a character to replace occuring letters.\n");
            while ((z = getchar() != '\n')) {

            }

            strFilter(y, x, z);  
            break;
        }
        }
    }

    printf("Would you like to enter another string?\n");
    gets(&loopContinue);

} while (loopContinue != 'n');

}

void strFilter(char a[], char b[], char c){
 int i = 0;
 int n = 0;

 while (n < 20) {

        for (i = 0; i < 40; i++) {
            if (a[i] == b[n]){
                a[i] = c;
            }

    }
    i = 0;
    n++;
}

   puts(a);
}

ありがとうございました。

4

1 に答える 1

4

まず、コードを少し読みやすくするようにしてください。インデントではなく、そのフローについて説明します。

また、ここの文字列には何も変更がないため、出力例は正常に機能しているようです...?

コーディングするときに覚えておくべきことがいくつかあります。

  • 特に、ある時点で誰かにコードを読み取らせる場合は、変数と関数に明示的な名前を付けます。
  • 実行する特定のタスク(ユーザーの入力を取得する、ランダムな文字列を生成するなど)がある場合は、ほとんどのコードを複雑なループで記述するのではなく、小さな関数を作成して、コードのフローを単純に保つようにしてください。
  • scanf(man scanf)を見て、ユーザーの入力を取得することもできます。
  • 適切なサイズではない可能性のある静的なバッファを使用するのではなく、ユーザーの入力を取得するときにバッファを割り当ててみてください

疑似コードを記述してCに変換するのは非常に簡単です。

WHILE someCondition
    Generate a random string
    Get a string from the user
    Get a character from the user
    Find and replace
END

コードを整理する方法の例を次に示します(ただし、コードは使用しないでください。無料ではなく、ユーザーの入力を取得できません)。

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

char* generateString(void)
{
    return "AEIOUYAEIOUY"; // In your implementation, this is where you'd generate the random string
}

char* getStringInput(void)
{
    return "HELLO"; // In your implementation, this is where you'd get the user's string
}

char getCharInput(void)
{
    return '*'; // In your implementation, this is where you'd get the user's character
}

char* findAndReplace(char* randomString, char* userString, char userChar)
{
    int l1;
    int l2;
    int i;
    int j;
    char* output;

    l1 = strlen(randomString);
    l2 = strlen(userString);
    output = (char*)malloc(sizeof(*output) * l1);
    strcpy(output, randomString);
    for (i = 0; i < l1; ++i)
    {
        for (j = 0; j < l2; ++j)
            if (randomString[i] == userString[j])
                output[i] = userChar;
    }

    return (output);
}

int main(int ac, char** av)
{
    char* randomString;
    char* userString;
    char userChar;
    char* outputString;

    randomString = generateString();
    userString = getStringInput();
    userChar = getCharInput();
    outputString = findAndReplace(randomString, userString, userChar);
    printf("Result: %s\n", outputString);

    // don't forget to free any allocated buffer

    return (1);
}

どのくらいのデバッグを行いましたか?コードにprintfsをいくつか入れて、何が起こるかを確認してください。関数が呼び出されたとき、変数の値は何ですか。例:

void fillS1(char x[])
{
 printf("-- entering fillS1, buffer value: %s\n", x);
 for (int i = 0; i < 40; i++)
     x[i] = 'A' + random() % 26;
 x[40] = (char)0;
 printf("-- leaving fillS1, buffer value: %s\n", x);
}

(printfを使用する前に、バッファの内容に注意してください)

これにより、何が問題になっているのかがすぐにわかります。

たとえば、strFilterが呼び出されたときに「c」の値を確認してみて、ユーザーの入力を取得する方法をもう一度確認してください。

于 2012-11-04T08:37:04.880 に答える