-4

ヘルプ!私は教授が私たちにくれたこのコードを理解しようとしています-

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

void encrypt(int offset, char *str) {

    int i,l;

    l=strlen(str);

    printf("\nUnencrypted str = \n%s\n", str);

    for(i=0;i<l;i++)
        if (str[i]!=32)  
            str[i] = str[i]+ offset;

    printf("\nEncrypted str = \n%s \nlength = %d\n", str, l);
}

void decrypt(int offset, char *str) {

    // add your code here
}

void main(void) {

    char str[1024];

    printf ("Please enter a line of text, max %d characters\n", sizeof(str));

    if (fgets(str, sizeof(str), stdin) != NULL)
    {
        encrypt(5, str);    // What is the value of str after calling "encrypt"?

        // add your method call here:
    }
}

次のことを行うことになっています。

  • Cコードをに変換しますC++

  • 「decrypt」メソッドにコードを追加して、暗号化されたテキストを解読します。

  • メッセージを暗号化および復号化するpointer操作ではなく操作を使用するようにコードを変更します。array

  • mainメソッドで、「decrypt」メソッドを呼び出して、暗号化されたテキスト(str)を解読します。

これは私が何とか行った限りですが、私は今かなり立ち往生しています。特に私にはそのC言語のバックグラウンドがないので。どんな助けでもいただければ幸いです。

#include <iostream>
#include <string.h>

void encrypt(int offset, char *str)
{   
    std::cout << "\nUnencrypted str = \n" << str;

    char *pointer = str;

    while(*pointer)
    {
        if (*pointer !=32)  
            *pointer = *pointer + offset;
        ++pointer;
    }

    std::cout <<"\nEncrypted str =\n" << str << "\n\nlength = ";
}

void decrypt(int offset, char *str) {

    // add your code here
}

void main(void) {

    char str[1024];

    std::cout << "Please enter a line of text max " << sizeof(str) << " characters\n";

    if (fgets(str, sizeof(str), stdin) != NULL)
    {
        encrypt(5, str);    // What is the value of str after calling "encrypt"?

        // add your method call here:
    }
}
4

2 に答える 2

3

最も整形式のCコードはC++としてコンパイル可能であり、ファイルの名前を.cppに変更し、C ++コンパイルを使用してコードをコンパイルし、壊れているものを修正します。少なくともvoidを返すとしてのmain()の宣言は壊れているはずです(これはせいぜい疑わしいCコードであり、明示的に正しくないC ++です)。

それはすべて、あなたの教授があなたに何を期待しているかに本当に依存します。「C++に変換する」という要件はあいまいすぎます。C ++のどの機能を使用する予定ですか?C++としての単純な再コンパイルは技術的にはC++コードになりますが(有効なCコードであっても)、それが演習の意図であったかどうかはどういうわけか疑わしいです。

重要なのは、再コンパイルによる表面的な変換は可能ですが、C++はそれを別の方法でコーディングする機会を提供するということです。例えば:

  • ヘッダーファイル名<stdio.h><string.h>はC++で非推奨になり、代わりに<cstdio>とを使用できます<cstring>。このコード<string.h>では冗長です。どのコードもそれに依存していません。

  • 非推奨ではないヘッダーを使用する場合、すべての標準ライブラリがstd::名前空間に含まれるため、すべての標準ライブラリシンボルには、プレフィックスを付けるstd::か、(あまり好ましくありませんが)using namespace std'ディレクティブを使用してスコープを解決する必要があります。

  • このコードは、C ++標準ライブラリの一部でもあるC標準ライブラリを使用していますが、C ++には、多くの点で優れた代替手段があります。<cstdio>たとえば、主に<iostream>となどの派生物、<stringstream>および<fstream>文字列処理に置き換えられ、実際には文字列データ型は。によって提供され<string>ます。このコードを使用<iostream><string>て実装すると、コードを大幅に簡素化できます。

  • クラスを使用する場合はstd::string、イテレータを使用して文字列の内容をトラバースすることができます。

  • C++はOOPをサポートしています。この場合、たとえば、暗号化メソッドと復号化メソッドの両方を含むクラスを作成できます。この場合、そうすることについての議論は、おそらく概念の理解を例示することを除いて、おそらく弱いですが。

したがって、「変換」の範囲は、ほとんど作業がない状態から完全な再設計まで、非常に広いことがわかります。デザインノートでは、私が行うことの1つは、暗号化/復号化メソッドを出力操作から分離することです。これらのメソッドは、結果をコンソールに出力することを主張していなければ、再利用できます。彼らは、データを発信者に返し、発信者が必要なことを実行できるようにする方がよいでしょう。もちろん、それもこの演習の範囲を超えている可能性があります。それが、課題があなたに提示された方法です。

于 2013-02-05T20:39:18.820 に答える
3

投稿したコードは、Cと同様にC ++でも機能するはずです。まだ説明していない特定の要件がない限り、何も「変換」する必要はありません。

配列からポインタへの変換は正しいように見えますが、コードは配列形式の方が読みやすいと思います。

あなたのdecryptメソッドでは、メソッドが行うことの逆を行うコードを書きたいと思うでしょうencrypt。これに取り組む最良の方法は、サンプルテキストを実行しencryptて、出力がどのように見えるかを調べることです。この関数は、入力を一度に1文字ずつ変換するため、入力をバイト単位で出力にマップできる必要があります。この情報を使用して、パターンを検出し、反対方向に変換する関数を作成できます。

于 2013-02-05T19:04:35.143 に答える