-1

文字を入力するとリストから文字を破棄するプログラムを作成しています。誰か助けてください。ありがとう。

例: (前)

ABCDEFGHIJKLMNOPQRSTUVWXYZ 文字を入力してください: A

(文字「A」を入力した後)

_BCDEFGHIJKLMNOPQRSTUVWXYZ 文字を入力してください:

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

int main()
{
    int alphabet[26];
    char letter;
    int i;
    int j;

    alphabet[0] = 'A';
    for(i = 0;i < 26; i++)
    {
        alphabet[i] = alphabet[0];
        printf ("%c", alphabet[i], alphabet[i]);
        alphabet[0]++;
    }

        printf("\n\nenter the letter you want to remove in the alphabet: ");
        scanf("%c", letter);

        while(j<alphabet[i])
        {
            if(letter==alphabet[i])
            {
                j--;
            }
        }
}

問題は、削除したい文字を入力したときにアルファベットの文字が削除されないことです。助けてください。ありがとう。

編集: 最後に、1 つの入力のみにする方法を教えてください。つまり、2 回目に同じ文字を入力すると、「その文字は既に入力されています」と表示されます。

4

4 に答える 4

1

ASCII のように文字が連続していると仮定していますが、Cではそれを仮定できません。

次の行には重複した引数があります。

   printf ("%c", alphabet[i], alphabet[i]);

最後の をドロップしalphabet[i]ます。

あなたの最後のif()文は間違っています: 比較は で行う必要があります==

何がしたいのか全く不明。

編集:

私はこのようにプログラムを行います:

#include <stdio.h>

int main()
{
    char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    char letter;

    printf("Choose a letter: ");
    letter = getchar();

    printf("\n\n");

    for(int i = 0; i < 26; i++)
      if (letter == alphabet[i]) 
         {
            alphabet[i] = '_';
            break;   /* This terminates the for() loop */
         }        

     printf("Result: %s \n", alphabet);
}  

EDIT2:alphabet文字列定数を後で変更する必要があるため、の宣言を変更しました...

于 2013-09-23T13:31:36.923 に答える
1

ステートメントで値を割り当てていますletter

letter=alphabet[i]

でない限り、このステートメントは常に true になりalphabet[i]ます0

代わりに比較を使用する

letter==alphabet[i]

また、最初whileは の値が undefined になるため、ループは少し奇妙ですj。そのため、比較は未定義になります。

   while(j<alphabet[i])
    {
        if(letter=alphabet[i])
        {
            j--;
        }

おそらく、次のようなことをしたいだけです:

   for(i = 0;i < 26; i++) {
      if(alphabeth[i]==letter) {
          alphabeth[i]='_';
      }
   }

文字の最初の出現のみを置き換えたい場合は、break;後に挿入しますalphabeth[i]='_';

また、ソースコードで「26」のような魔法の値が複数回発生することはおそらく望ましくありません。

代わりに次のようなものを使用します

 #define ALPHABETSIZE 26

26のすべての出現を置き換えますALPHABETSIZE

于 2013-09-23T13:34:39.347 に答える
0

ここには、自分自身を困難にするために行っていることがいくつかあります。

2 つの変数を比較するには、「=」ではなく「==」を使用する必要があります

「j」の値は初期化されていないため、「j--」は未定義になります

おそらく、すべての型を同じに保ち、配列を「int」配列ではなく「char」配列にする方がよいでしょう。

配列から要素を削除するには "int alphabet[26];" これは非常に難しく、おそらくこれを「文字列」演習にする方が簡単です。あなたが本当にできることは、「空白」の文字を作ることだけです

alphabet[j] = ' ';

要件をより明確に説明すれば、より良い設計を行うことができると思います:)

于 2013-09-23T13:41:32.457 に答える
0

私が正しければ、配列を調べて、入力された文字が配列内のいずれかと一致するかどうかを確認してください。

このような for ループを使用せず、while ステートメントの代わりに配列の位置を 0 に設定する理由はありますか?

for(i=0;i<26;i++)
{
   if(letter == alphabet[i]) 
      alphabet[i] = "_"; // or setting it to 0 if you use and int-array
}

それとも、ここで何か間違っていますか?

于 2013-09-23T13:39:18.640 に答える