0

私は C を学ぼうとしている初心者のプログラマーです。現在、私はクラスを受講していて、割り当てられたプロジェクトを持っていて、少なくともその主要部分をかなり早く終わらせることができました。ただし、いくつかの新しい関数 (つまり、fgets と strncmp) を使い始めたため、main() if 関数の周りでコーディングに問題がありました。現在、コードはコンパイラで動作しますが、どのオンライン コンパイラでも動作しません。それで、私はそれで何か間違ったことをしたのだろうか、それともそれを改善できる方法があるのだろうかと思っています.

どんな助けや貢献も大歓迎です、ありがとう!

以下はコードです。暗号化関数と復号化関数は、メインの前の最初の 2 つの関数であり、ほとんどの厄介なショートカット コードがあると思われます。

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

char * Encrypt(char sentence[])
{
int primes[12] = {1,2,3,5,7,11,13,17,19,23,29,31};
int x = 0;
int counter = 0;
int ispositive = 1;

 while(sentence[x] != 0)
    {
    if (counter == 0)
        {
        ispositive = 1;
        }
    else if(counter == 11)
        {
        ispositive = 0;
        }

    if (ispositive == 1)
        {
        sentence[x] = sentence[x] + primes[counter];
        counter++;
        }
    else if (ispositive == 0)
        {
        sentence[x] = sentence[x] + primes[counter];
        counter--;
        }
    x++;
    }

    return sentence;
}

char * Decrypt(char sentence[])
{
int primes[12] = {1,2,3,5,7,11,13,17,19,23,29,31};
int x = 0;
int counter = 0;
int ispositive = 1;

 while(sentence[x] != 0)
    {
    if (counter == 0)
        {
        ispositive = 1;
        }
    else if(counter == 11)
        {
        ispositive = 0;
        }

    if (ispositive == 1)
        {
        sentence[x] = sentence[x] - primes[counter];
        counter++;
        }
    else if (ispositive == 0)
        {
        sentence[x] = sentence[x] - primes[counter];
        counter--;
        }
    x++;
    }

    return sentence;
}

int main()
    {
    char message[100];
    char input[7];
    char *p;
    int c;
    int condition = 1;

    while(condition == 1)
    {

    printf("Would you like to Encrypt or Decrypt a message? (Type TurnOff to end the program) \n \n");

    fgets(input,7, stdin);

    fflush(stdin);

        if (!strncmp(input,"Encrypt",strlen(input)))
            {

            printf("\n \n Enter the message you want to Encrypt below: \n \n");

            fgets(message, 100, stdin);

            Encrypt(message);

            printf("\n Your encrypted message is: ");

            printf("%s", message);

            fflush(stdin);

            printf("\n \n");

            }
         else if (!strncmp(input,"Decrypt",strlen(input)))
         {
            printf("\n \n Enter the message you want to Decrypt below: \n \n");

            fgets(message, 100, stdin);

            Decrypt(message);

            printf("\n Your Decrypted message is: ");

            printf("%s", message);

            fflush(stdin);

            printf("\n \n");
         }
         else if (!strncmp(input,"TurnOff",strlen(input)))
         {
            printf("\n \n Thank you for using the program! \n \n");
            condition = 0;
         }
         else
         {
             printf("That's not a valid input \n \n");
         }
    }


    }
4

2 に答える 2

1

printf の後、fflush(stdout) を実行する代わりに fflush(stdin) を実行します。出力を印刷しているためです。出力は標準出力に出力されます。そのため、stdin バッファではなく stdout バッファをフラッシュする必要があります。

strncmp の代わりに strcmp を使用できます。ここでは、入力配列のホール文字を比較しているためです。したがって、strcmp で十分です。

strcmp(入力、「暗号化」)。

strcmp または strncmp 関数は、null または宣言されている文字列のサイズまでの入力を配列で取得します。

入力配列のサイズが小さすぎます。

入力は以下のようになります。

暗号化\nsureshkumar\n

ここでは、最初にメイン関数の fgets が「暗号化」まで読み取り、「\n」をスキップしません。

'\n' は別の fgets から読み取られます。そのため、暗号化メッセージ「sureshkumar」は取得されません。

したがって、コードを変更する必要があります。入力配列のサイズを増やします。

そして、以下のように状態を確認してください。

if(strcmp(input, "Encrypt\n") == 0)
{
/*
 You will do what you want
*/
}

上記の方法を使用するか、入力を読み取って入力配列の '\n' を '\0' に上書きし、以前と同じように比較することができます。ただし、strcmp を使用する必要があります。配列のサイズがインクリメントされるためです。

これは、fgets を使用する正しい方法です。fgets の使用は、新しい行まで読み取ることです。

文字配列にはヌル文字を使用する必要があります。これは文字配列に必要だからです。

于 2015-10-24T08:12:21.213 に答える
0

strcmp() と fgets() の使用に対するあなたのイニシアチブは適切ですが、次の理解が必要
です。あなたの場合、

fgets(input,7, stdin);

入力に ​​"Encrypt"/"Decrypt"/"TurnOff"を指定しました
が 、size=7 ((7-1)=6 文字のみが読み取られているため) のため、
'input' バッファーは "Encryp"/"Decryp"/"TurnOf" としてデータを取得しました
、 fgets() によって '\0' 文字用に予約された最後の位置)。

  1. strncmp() 呼び出しは、現在のコードで正しく機能します。strncmp() の場合、長さを比較するためです。

    n = strlen(入力) = 6;

「Encrypt」/「Decrypt」/「TurnOff」の 3 つのケースすべてで 6 文字が一致しています。

要約すると、現在のコードは正常に動作しますが、実際の意図に違反しています。実際には、オプション文字列の全長を読み取って比較したかったのです。

編集完了: 提案された変更:

#define SIZE 9   <-- EDIT : Change done here, instead of 7, size = 9 is used
                            to allow reading '\n' so that it does not affect
                            fgets() read in successive iteration
char input[SIZE];

fgets(input, SIZE, stdin); // read str is e.g. "Encrypt\n"
input[SIZE-2] = '\0'; // To replace '\n' with '\0'

同様に、fgets() を使用して 'message' 配列を読み取る場合も注意が必要です。

于 2015-10-24T10:17:36.670 に答える