0

まず、知っているかどうかにかかわらず、私のためにこれまでにしてくれたすべての人に感謝したいと思います。私は初めてのポスターの長年の潜伏者です。

C とそのバリエーションのいくつかに基づいた新しいクラスを開始しています。問題は、少なくとも C++ の経験があることを前提としていることです。残念ながら、私は Java と Mips を数学期しか受けていません。私は今、C を学ぶのに苦労しています。本も授業計画もありません。Google を使用して最初の 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) {


}   

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

したがって、宿題の質問はコードにリストされていますが、明確にするために、それは私が求めているものではありません。このプログラムがこれまでどのように機能しているかを理解したいと思います。

具体的には:

  1. なぜ書くのかchar str[1024]

  2. 正確には何をしているのif (fgets(str, sizeof(str), stdin) != NULL)ですか?まともな考えはあるが、その背後にある理由が分からない。

3.そして最後に(願わくば)

if (str[i]!=32)
    str[i] = str[i]+ offset;

str[i]なぜ私たちは32 に等しくないことを心配しているのですか?

質問が多くて申し訳ありませんが、本当に理解したいと思っています。

また、この時点で今学期の残りについてかなり心配しているので、C の素晴らしい読み物を知っている場合はお知らせください。

編集:

私に答えてくれたみんなに本当にありがとうと言いたいです。残念ながら、私はあなたが私を助けてくれたことを認めるために、すぐにもっと質問を続けたいと思っている人の一人ではありません. ですから、私が直接感謝したり、コメントを返したりしなかった皆さん、どうもありがとうございました。ほんの 30 分前には緊張していた非常に初歩的な概念のいくつかを、今ではよりしっかりと把握できています。

4

5 に答える 5

2
  1. char str[1024]Cには文字列の概念がなく、NUL別名0で終了する配列のみがあるため、使用charします。明示的に自分で実装しない「伸縮性のある」コンテナの概念はありません。したがって、独自の入力処理を大量に記述せずに入力の文字列を読み取りたい場合は、最大長 (この場合は 1024) を推測し、事前にそのためのスペースを確保します。
  2. fgets文字列を読み取ります (C で「文字列」と言うときはchar、上記のように「0 で終了する配列」を意味します)。strこれはストレージの開始点へのポインターであり、sizeof(str)コンパイル時に数値として評価されます。これは、この場合、行を変更した場合に変更を追跡するという利点があることをstr意味します.その引数は、 の割り当てられたスペースを超えて書き込むことを防ぎます. 覚えておいてください, これは伸縮性のある文字列ではありません.1024char strfgetsstr
  3. ASCII 32 はスペースです。書いたほうが分かりやすいstr[i] != ' '
于 2012-09-17T02:07:18.690 に答える
2

A great start would be Kernighan + Ritchie's book,The C Programming Language.
Amazon: here

Also, see The Definitive C Book Guide and List.

于 2012-09-17T02:16:22.643 に答える
0
  1. これは、それstrが 1024charの配列であることを示しています
  2. "fgets() は、ストリームから最大で size 文字未満の 1 文字を読み取り、s が指すバッファーに格納します。読み取りは、EOF または改行の後に停止します。改行が読み取られた場合は、バッファーに格納されます。 null バイト ('\0') は、バッファ内の最後の文字の後に格納されます。"
  3. 明らかに、値が 32 の文字は「暗号化」されません。ASCII テーブルを見つけて、特殊文字 32 が何であるかを確認してください...

ps。「gets() と fgets() は、成功すると s を返し、エラーが発生した場合、または文字が読み取られていないときにファイルの終わりが発生した場合は NULL を返します。」

于 2012-09-17T02:03:18.113 に答える
0
char str[1024];

strの 1024 要素の配列として宣言しcharます。

fgets(str, sizeof (str), stdin)

(標準入力、基本的にはコンソール)sizeof (str)から最大(1024)文字を読み取り、それらの文字をに保存します。 読み取り中にエラーが発生した場合は NULL を返すため、stdinstrfgets

if (fgets(std, sizeof(str), stdin) != NULL)
{
  encrypt(...);
  ...
}

if入力文字列の読み取りに成功した場合にのみ、ステートメントの本体を実行します。

32' 'スペース ( ) 文字の ASCII コードです。何らかの理由で、暗号化アルゴリズムは文字列内の空白文字をそのまま残します。

于 2012-09-17T02:11:54.607 に答える
0

First question:

In Java, you have to new all your arrays, e.g. char[] arr = new char[1024]. In C (and C++), you can opt to either dynamically allocate the array like Java (using malloc in C and new [] in C++), or statically allocate the array using a fixed size (the char str[1024] you see there).

In C, because all memory needs to be manually managed with malloc and free, statically allocated buffers save a bit of hassle since they are automatically freed when the function exits. In Java, you rarely deal with memory allocation because the runtime automatically garbage collects unused objects.

In Java, you have String, which wraps an array of char. In C, you only have arrays of char, typically represented as either an array of char or a pointer to the first character (char *). Note too that the Java char is 16 bits (2 bytes) wide as it handles Unicode; the C char is only 8 bits (1 byte) in size.

Finally, note that in C, all strings are terminated by a null byte '\0'. Strings thus have to be big enough to hold both the content and the terminating null byte -- failing to count that null byte might result in a buffer overflow.

Second question:

In Java, you can use readLine to read a line of text from a file, or from the user's input. In C, you use fgets. However, in Java, the runtime will dynamically allocate a string big enough to hold the input line (however long that line might be); in C, since buffers are typically allocated by the programmer, the function can only read as many characters as the buffer will permit (reading characters past the end of a buffer is called a buffer overflow, a common cause of security vulnerabilities).

fgets therefore takes three parameters: the buffer to read into, the size of that buffer, and the file to read from (here stdin, the console).

Third question:

Strings in C are simply sequences of ASCII characters. So, the code there is encrypting characters (by adding this "offset") only if the character isn't 32 -- a space character. The result is that all non-spaces will be transformed to gibberish, leaving the spaces intact.

于 2012-09-17T02:15:41.577 に答える