0

このプログラムは出力することになっていますVYGHBUTMDEが、最後にいくつかのガベージ文字を追加します。どうしてこれなの?

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

int
encrpypt(char ciphertext_buffer[], char plaintext[], char key[]) {
  int i;
  for (i=0; i<strlen(plaintext); i++) {
    ciphertext_buffer[i] = (char) ( ( ((int)plaintext[i] - 65 + (int)key[i%(strlen(key))] - 65) % 26 ) + 65 );
  }
  return 0;
}

int
main() {
  char ciphertext_buffer[10];
  encrpypt(ciphertext_buffer, "THISISCOOL", "CRYPT");
  printf("%s\n", ciphertext_buffer);
  return 0;
}
4

3 に答える 3

7

10バイトの文字列に10バイトの配列を割り当てるだけなので、終了するヌル文字を配置する場所は「ありません」。バッファサイズを、「表示」文字の文字列の長さより少なくとも1文字大きくすることを検討してください。

于 2013-02-14T03:27:09.653 に答える
1

文字配列は「/0」で終了する必要があります。したがって、常に最大文字列サイズ+1としてchar配列を割り当てる必要があります。

以下の修正を試してください。

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

int encrpypt(char ciphertext_buffer[], char plaintext[], char key[]) {
  int i;
  for (i=0; i<strlen(plaintext); i++) {
    ciphertext_buffer[i] = (char) ( ( ((int)plaintext[i] - 65 + (int)key[i%(strlen(key))] - 65) % 26 ) + 65 );
  }
 ciphertext_buffer[i] = '\0';
  return 0;
}

int
main() {
  char ciphertext_buffer[11];
  encrpypt(ciphertext_buffer, "THISISCOOL", "CRYPT");
  printf("%s\n", ciphertext_buffer);
  return 0;
}
于 2013-02-14T03:39:40.860 に答える
1

文字列をnullで終了しているわけではありません。これが少し変更されたバージョンです:(まだ問題がありますが)

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

int
encrpypt(char ciphertext_buffer[], char plaintext[], char key[]) {
  int i;
  for (i=0; i<strlen(plaintext); i++) {
    ciphertext_buffer[i] = (char) ( ( ((int)plaintext[i] - 65 + (int)key[i%(strlen(key))] - 65) % 26 ) + 65 );
  }
  ciphertext_buffer[i] = 0;
  return 0;
}

int
main() {
  char ciphertext_buffer[11];
  encrpypt(ciphertext_buffer, "THISISCOOL", "CRYPT");
  printf("%s\n", ciphertext_buffer);
  return 0;
}

より大きな問題は、境界チェックを行っていないことです。より良いバージョンは次のとおりです。

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

int
encrpypt(char ciphertext_buffer[], char plaintext[], char key[], int size) {
  int i;
  for (i=0; i<strlen(plaintext); i++) {
    if (i > size - 1) break;
    ciphertext_buffer[i] = (char) ( ( ((int)plaintext[i] - 65 + (int)key[i%(strlen(key))] - 65) % 26 ) + 65 );
  }
  ciphertext_buffer[i] = 0;
  return 0;
}

int
main() {
  char ciphertext_buffer[11];
  encrpypt(ciphertext_buffer, "THISISCOOL", "CRYPT", sizeof(ciphertext_buffer));
  printf("%s\n", ciphertext_buffer);
  return 0;
}
于 2013-02-14T03:36:07.233 に答える