0

恥ずかしいほど初歩的な質問がいくつかありますが、処理できる答えを見つけることができないようです。前回、皆さんに助けを求めたときは、信じられないほどの幸運がありましたので、繰り返していただきたいと思います。私はC/C ++の経験がなく、このクラスは少なくとも1学期を想定しているので、少しだけキックします。

これは私が教授から与えられたコードです:

#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++に変換します。すべてのprintf、scanf、およびfgetsステートメントを置き換えます。
  • 「decrypt」メソッドにコードを追加して、暗号化されたテキストを解読します。
  • メッセージの暗号化と復号化に配列操作の代わりにポインター操作を使用するようにコードを変更します。
  • mainメソッドで、「decrypt」メソッドを呼び出して、暗号化されたテキスト(str)を解読します。

私は課題に対する直接の回答を求めているのではありませんが、私が犯している誤りと私がしなければならないことを理解する助けが必要です。

これは宿題の最初の部分での私の試みです:

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

void encrypt(int offset, char *str) {

int i,l;

l=strlen(str);

cout << "\nUnencrypted str = \n%s\n", str;

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

cout << "\nEncrypted str = \n%s \nlength = %d\n", str, l;
}

void decrypt(int offset, char *str) {

// add your code here
}

int main(void) {

char str[1024];

cout << "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:
}
}

問題は、これが私が得ているものであり、別の方法で何をする必要があるのか​​理解できないことです。

テキストの行を入力してください、最大%d文字hellow world

暗号化されていないstr=%s

暗号化されたstr=%s長さ=%d

この時点で何もできません。私はすでに数時間グーグルで物事を試しましたが、実際にはどこにも行かず、これは1時間以内で済むはずです。

4

2 に答える 2

3

std::iostreamprintfスタイルのフォーマットは受け付けません。代わりに、文字列を壊して<<、次のように引数で別の文字列をチェーンします

int myInt = 5;
std::cout << "HelloWorld" << myInt << '\n';

これはすべての基本タイプで機能しますが、カスタムクラスの場合は、手動でostream <<演算子を追加する必要があります。

于 2012-09-23T23:26:56.537 に答える
1

「配列操作の代わりにポインタ操作を使用してメッセージを暗号化および復号化するようにコードを変更する」を見て、これを説明できるかどうかを見てみましょう。(ポインタ部分に焦点を当てます)。暗号化機能を数回書き直して、うまくいけば明確にします

まず、をループに変換forしますwhile

void encrypt(int offset, char *str) 
{
    int i,l;

    l=strlen(str);

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

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

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

strlen今、私たちは呼び出しを取り除くことを試みます。strlenC文字列の先頭からヌル文字が最初に出現するまでのすべての文字をカウントします。ヌル文字は次のように書くことができます'\0'が、CまたはC ++では、ちょうどを書くのとほとんど同じ0です。比較と同様に、文字列の位置にある文字が0でない限り、ループしたい場合にstr[i] != 32書き込むことができます。str[i] != 0istr

void encrypt(int offset, char *str) 
{
    int i;

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

    i = 0;
    while(str[i] != 0)
    {
        if (str[i]!=32)  
            str[i] = str[i]+ offset;
        ++i;
    }

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

str[i]以下と同等ですが、*(str + i)書き方が異なります。もう一度書き直すことができます

void encrypt(int offset, char *str) 
{
    int i;

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

    i = 0;
    while(*(str + i) != 0)
    {
        if (*(str + i)!=32)  
            *(str + i) = *(str + i) + offset;
        ++i;
    }

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

これで、ポインターのみを使用した解決策がすでに得られましたが、ポインターをよりよく理解することで、よりきれいにすることができます。

別の変数を使用してもう一度書き直しましょう

void encrypt(int offset, char *str) 
{
    int i;

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

    i = 0;
    char *ptr = (str + i);
    while(*ptr != 0)
    {
        if (*ptr!=32)  
            *ptr = *ptr + offset;
        ++i;
        ptr = (str + i);
    }

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

したがって、ここで行ったのは、(s + i)を新しい変数に置き換えただけですptr。最後のステップでは、iを削除します。これは単なるヘルパー変数であるため、開始アドレスからジャンプする必要のある場所の数を示します。ただし、反復ごとに1つだけ増加するため、ポインターを直接移動するだけです。

void encrypt(int offset, char *str) 
{
    printf("\nUnencrypted str = \n%s\n", str);

    char *ptr = str;
    while(*ptr) // the same as *ptr != 0
    {
        if (*ptr!=32)  
            *ptr = *ptr + offset;
        ++ptr;
    }

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

次に、Seth Carnegieが提案したように、printf通話を通話に置き換えます。std::cout

復号化の場合:: when encrypt 'sees' a chracter that is not equal to 32, it addsその文字へのencryptoffset`で何が起こっているかを確認し、それを割り当て直してください。したがって、この操作を元に戻すには、何をしなければならないかを考えてみてください(これはCとはまったく関係ありません)

于 2012-09-24T00:26:18.747 に答える