0

int bit_to_ascii(const char input[], char output[]);文字の配列からバイナリコードを読み取り、それを変換する関数を作成する必要がありました。そして、私はすでにそれをしました。

自宅のコンピューターでCode::Blocksを使用している間は、すべて正常に動作します。しかし、マーク用のプログラムを保持する必要があるサーバーにコードを配置すると、コンパイルされますが、プログラムの最初のステップの後にセグメンテーション違反が発生します。私のせいは何ですか?そして、Code :: Blocksのコンパイラとサーバーのコンパイラの違いは何ですか?

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

#define LINES 5

/* assignment #1 function prototype */
int bit_to_ascii(const char input[], char output[]);

int main( ) {

const char *core_data[ ] = {
"0", /* should insert the null byte '\0' only */

"01010111 This sequence contains the letter 'W'       " /*  87 = 'W' */
"      r5 0 #! 1 1 gP 0 f66-:] 0 [ } 1 v4t^ 0 1 n>?:77" /* 101 = 'e' */
" junk ^*@&#^% 0110  more junk }{r;,<> 1100         2x" /* 108 = 'l' */
"                  0    1       1     0 0          011" /*  99 = 'c' */
"0  ^%jh  1 ]{) OVR 1 - 0 _! 9 + 1  118Y z(x pM1      " /* 111 = 'o' */
"This next group of 8 should be SKP skipped! 11111111 " /* skipped */
"*&^! 0  1  1  0 1     1 0     128673kjshd:L<    2938 " /* 109 = 'm' */
"      r5 0 #! 1 1 gP 0 f66-:] 0 [ } 1 v4t^ 0 1 n>?:77" /* 101 = 'e' */
"#!/bin/bash 00  1 00 00 0 g^b-ps 6@&^%               " /*  32 = ' ' */
"01010100 This sequence contains the letter 'T'       " /*  84 = 'T' */
"0  ^%jh  1 ]{) OVR 1 - 0 _! 9 + 1  118Y z(x pM1      " /* 111 = 'o' */
"#!/bin/bash 00  1 00 00 0 g^b-ps 6@&^%               " /*  32 = ' ' */
"---repeat--->0 1 0 0 1 1 1 1<------------RPT2--------" /*  79 = 'O' */
"0 1 0 1 0bbavac9872962  000&*************************" /*  80 = 'P' */
"a0b0c1d1e0f0g1h0ijklmnopqrstuvwxyz*******************" /*  50 = '2' */
"00fg333                                110100>>>>>>>>" /*  52 = '4' */
"00fg333                                110100>>>>>>>>" /*  52 = '4' */
"                     0000                            ",/*  0 = '\0' */

"00011110 This char should not be inserted!           " /*  30 cntrl */
" 00011111 This char should not be inserted!          " /*  31 cntrl */
"  00100000                                           " /*  32 = ' ' */
"   00100001                                          " /*  33 = '!' */
"    00100010                                         " /*  34 = '"' */
"     00100011                                        " /*  35 = '#' */
"      00100100                                       " /*  36 = '$' */
"       00100101                                      " /*  37 = '%' */
"        00100110                                     " /*  38 = '&' */
"         00100111                                    " /*  39 = ''' */
"          00101000                                   " /*  40 = '(' */
"           00101001                                  " /*  41 = ')' */
"            00101010                                 " /*  42 = '*' */
"             00101011                                " /*  43 = '+' */
"              00101100                               " /*  44 = ',' */
"               00101101                              " /*  45 = '-' */
"                00101110                             " /*  46 = '.' */
"                 00101111                            " /*  47 = '/' */
"                  00110000                           " /*  48 = '0' */
"                   00110001                          " /*  49 = '1' */
"                    00110010                         " /*  50 = '2' */
"                     00110011                        " /*  51 = '3' */
"                      00110100                       " /*  52 = '4' */
"                       00110101                      " /*  53 = '5' */
"                        00110110                     " /*  54 = '6' */
"                         00110111                    " /*  55 = '7' */
"                          00111000                   " /*  56 = '8' */
"                           00111001                  " /*  57 = '9' */
"                            00111010                 " /*  58 = ':' */
"                             00111011                " /*  59 = ';' */
"                              00111100               " /*  60 = '<' */
"                               00111101              " /*  61 = '=' */
"                                00111110             " /*  62 = '>' */
"                                 00111111            " /*  63 = '?' */
"                                  01000000           " /*  64 = '@' */
"                                   00000000          ",/*   0 = '\0'*/

"                                    01000001         " /*  65 = 'A' */
"                                     01000010        " /*  66 = 'B' */
"                                      01000011       " /*  67 = 'C' */
"                                       01000100      " /*  68 = 'D' */
"                                        01000101     " /*  69 = 'E' */
"                                         01000110    " /*  70 = 'F' */
"                                          01000111   " /*  71 = 'G' */
"                                           01001000  " /*  72 = 'H' */
"                                            01001001 " /*  73 = 'I' */
"                                             01001010" /*  74 = 'J' */
"                                            01001011 " /*  75 = 'K' */
"                                           01001100  " /*  76 = 'L' */
"                                          01001101   " /*  77 = 'M' */
"                                         01001110    " /*  78 = 'N' */
"                                        01001111     " /*  79 = 'O' */
"                                       01010000      " /*  80 = 'P' */
"                                      01010001       " /*  81 = 'Q' */
"                                     01010010        " /*  82 = 'R' */
"                                    01010011         " /*  83 = 'S' */
"                                   01010100          " /*  84 = 'T' */
"                                  01010101           " /*  85 = 'U' */
"                                 01010110            " /*  86 = 'V' */
"                                01010111             " /*  87 = 'W' */
"                               01011000              " /*  88 = 'X' */
"                              01011001               " /*  89 = 'Y' */
"                             01011010                " /*  90 = 'Z' */
"                            01011011                 " /*  91 = '[' */
"                           01011100                  " /*  92 = '/' */
"                          01011101                   " /*  93 = ']' */
"                         01011110                    " /*  94 = '^' */
"                        01011111                     " /*  95 = '_' */
"                       01100000                      " /*  96 = '`' */
"                      00000000                       ",/*   0 = '\0'*/

"                     01100001                        " /*  97 = 'a' */
"                    01100010                         " /*  98 = 'b' */
"                   01100011                          " /*  99 = 'c' */
"                  01100100                           " /* 100 = 'd' */
"                 01100101                            " /* 101 = 'e' */
"                01100110                             " /* 102 = 'f' */
"               01100111                              " /* 103 = 'g' */
"              01101000                               " /* 104 = 'h' */
"             01101001                                " /* 105 = 'i' */
"            01101010                                 " /* 106 = 'j' */
"           01101011                                  " /* 107 = 'k' */
"          01101100                                   " /* 108 = 'l' */
"         01101101                                    " /* 109 = 'm' */
"        01101110                                     " /* 110 = 'n' */
"       01101111                                      " /* 111 = 'o' */
"      01110000                                       " /* 112 = 'p' */
"     01110001                                        " /* 113 = 'q' */
"    01110010                                         " /* 114 = 'r' */
"   01110011                                          " /* 115 = 's' */
"  01110100                                           " /* 116 = 't' */
" 01110101                                            " /* 117 = 'u' */
"01110110                                             " /* 118 = 'v' */
" 01110111                                            " /* 119 = 'w' */
"  01111000                                           " /* 120 = 'x' */
"   01111001                                          " /* 121 = 'y' */
"    01111010                                         " /* 122 = 'z' */
"     01111011                                        " /* 123 = '{' */
"      011111RPT10                                    " /* 124 = '|' */
"       01111101                                      " /* 125 = '}' */
"        00000000                                     " /*   0 = '\0'*/
};

char phrase[41];
char correct[LINES][41] = {
  "",
  "Welcome To OOP244",
  " !\"#$%&'()*+,-./0123456789:;<=>?@",
  "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`",
  "abcdefghijklmnopqrstuvwxyz{||||||||||}"
 };

int rvalues[LINES] = { 1, 18, 34, 33, 39 }, i;
int valid = 1, rc;

for(i=0; i<LINES && valid; i++) {
  rc = bit_to_ascii(core_data[i], phrase);
  if(rc != rvalues[i] || strcmp(phrase, correct[i])) {
 printf("Failed on test... %d\n\n", i+1);
 valid = 0;
  }
  else {
 printf("Passed test %d...\n\n", i+1);
  }
  printf("Your string ----------> '%s'\n", phrase);
  printf("Actual string --------> '%s'\n", correct[i]);
  printf("Your return value ----> %d\n", rc);
  printf("Actual return value --> %d\n", rvalues[i]);
  printf("Press the ENTER key to continue...");
  getchar( );
 }
 if(valid) {
  printf("\nCongratualtions!!! You passed all tests.\n");
  printf("You may hand in your assignment.\n");
 }
 else {
  printf("\nYou correctly sequenced %d/5 data blocks...\n", i-1);
  printf("Your program still needs some work!\n");
  printf("Keep at it!\n\n");
 }
 return 0;
 }

 int bit_to_ascii(const char core[ ], char data[ ]) {
   int i, rc = 0, j, inte[7], len, len2, m, rpt1, rptcounter, bin, lendata = 0, p = 0;
   char binarray[9], rpt[4], skp[9];
    rpt[4]='\0';
   for(i=0, j=0; core[i] != '\0'; i++) {
 switch(core[i]) {
 case '1':
 case '0':
  if(j<8) {
       binarray[j++] = core[i];
       binarray[j] = '\0';
    }
  else {
     binarray[j] = '\0';
     inte[0] = (binarray[0] - 48) * 128;
     inte[1] = (binarray[1] - 48) * 64;
     inte[2] = (binarray[2] - 48) * 32;
     inte[3] = (binarray[3] - 48) * 16;
     inte[4] = (binarray[4] - 48) * 8;
     inte[5] = (binarray[5] - 48) * 4;
     inte[6] = (binarray[6] - 48) * 2;
     inte[7] = (binarray[7] - 48) * 1;

     bin = inte[0] + inte[1] + inte[2] + inte[3] + inte[4] + inte[5] + inte[6] +inte[7];
     if(bin<=0 || bin >=32) {
     data[lendata] = bin;
     lendata++;
     }
     j = 0; /* resets j to 0 after 8 1's or 0's have been found */

     if(j<8) {
       binarray[j++] = core[i];
     }//end if
     }//end else
     case 'R':

    if(core[i+1] == 'P' && core[i+2] == 'T') {
      i=i+3;
      if(isdigit(core[i])) {
         rpt[0] = core[i];
         i++;

            if(isdigit(core[i])) {
               rpt[1] = core[i];
               i++;
                  if(isdigit(core[i])) {
                     rpt[2] = core[i];
                     i++;
                  }
            }

         rpt1 = atoi (rpt);
         //printf("\n\n%d\n\n", rpt1);
         len = strlen(binarray);
         for(rptcounter=0, j=0; rptcounter<rpt1; rptcounter++ ){ //loops rpt1 times
            if(len<8){
                      len2 = 8 - len;
                      m = len;
                      do {
                                  binarray[m]='0';
                                  m++;
                      }while (m != 8);
                      }
            inte[0] = (binarray[0] - 48) * 128;
            inte[1] = (binarray[1] - 48) * 64;
            inte[2] = (binarray[2] - 48) * 32;
            inte[3] = (binarray[3] - 48) * 16;
            inte[4] = (binarray[4] - 48) * 8;
            inte[5] = (binarray[5] - 48) * 4;
            inte[6] = (binarray[6] - 48) * 2;
            inte[7] = (binarray[7] - 48) * 1;
      bin = inte[0] + inte[1] + inte[2] + inte[3] + inte[4] + inte[5] + inte[6]+inte[7];
            data[lendata] = bin;
            lendata++;
         }
      }
      }
      break;
    case 'S':
   if(core[i+1] == 'K' && core[i+2] == 'P') {
   i=i+3;
   for(p=0;p!=8;i++) {
      switch(core[i]) {
      case '1':
      case '0':
           skp[p] = core[i];
           p++;
           break;
      }
   }
   }
    break;
  }//end case
  }//end for
   binarray[j] = '\0';
   len = strlen(binarray);
            if(len<8){
                      len2 = 8 - len;
                      m = len;
                      do {
                                  binarray[m]='0';
                                  m++;
                      }while (m != 8);
                      }
   inte[0] = (binarray[0] - 48) * 128;
   inte[1] = (binarray[1] - 48) * 64;
   inte[2] = (binarray[2] - 48) * 32;
   inte[3] = (binarray[3] - 48) * 16;
   inte[4] = (binarray[4] - 48) * 8;
   inte[5] = (binarray[5] - 48) * 4;
   inte[6] = (binarray[6] - 48) * 2;
   inte[7] = (binarray[7] - 48) * 1;
   bin = inte[0] + inte[1] + inte[2] + inte[3] + inte[4] + inte[5] + inte[6] + inte[7];
   data[lendata] = bin;
   lendata++;
   data[lendata]='\0';
   rc = strlen(data) + 1;
   if (rc==0) {
          rc++;
          }
   return rc;
}
4

3 に答える 3

1

問題は 290 行目だと思います。lendata が大きすぎます (3533)。あなたのコードを理解するのにいくつか問題があります。しかし、lendata は 41 (フレーズのサイズ) 未満でなければなりませんか? (ただし、デバッガを使用してください。UNIX では gdb を使用します。ddd というグラフィカル フロントエンドがあります。) 編集: inte は 180 行目から [7] 行目に宣言されています。ほとんどは行 [8] です。

于 2012-05-28T20:02:37.370 に答える
1

飛び出したもう一つの問題は

char binarray[9], rpt[4], skp[9];
rpt[4]='\0';

rpt[4]有効なインデックスは 0 ~3 ですが、0 に設定しています。

inteの 8 つの要素に書き込みます。

inte[0] = (binarray[0] - 48) * 128;
inte[1] = (binarray[1] - 48) * 64;
inte[2] = (binarray[2] - 48) * 32;
inte[3] = (binarray[3] - 48) * 16;
inte[4] = (binarray[4] - 48) * 8;
inte[5] = (binarray[5] - 48) * 4;
inte[6] = (binarray[6] - 48) * 2;
inte[7] = (binarray[7] - 48) * 1;

宣言されていますがint i, rc = 0, j, inte[7], ...

于 2012-05-28T20:08:33.853 に答える
-1

正しく表示されていない可能性がありますが、core_data の行はコンマで区切るべきではありませんか?

于 2012-05-28T19:31:03.967 に答える