2016-10-22 4 views
0

Я пытаюсь сделать программу, которая преобразует слово в двоичные числа. Например:Слово для двоичных чисел программа в C

Входной сигнал:

ABCD

Выход (Во-первых ASCII код а, б, в и г):

(ASCII-коде , b, c и d)

a: 97

б: 98

гр: 99

д: 100

Чем преобразовать их в двоичный:

97: 1100001

98: 1100010

99: 1100011

100: 1100100

И, наконец, вывод должен быть таким:

110000 | 11100010 | 1100011 | 1100100

Или без прямых линий между ними.

Но я получаю сообщение об ошибке:

Вход:

Выход:

Сегментация невыполненным (ядро сбрасывали)

Вот код:

#include <stdio.h> 

#define MAXINPUTCHAR 100 
#define MAXBINARYNUMERAL 32 

int thestr[MAXINPUTCHAR]; 
int theastr[MAXINPUTCHAR]; 
int thebstr[MAXINPUTCHAR][MAXBINARYNUMERAL]; 
//function declerations... 
void mydtob(int,int*);//Decimal to binary converter 
void mystreverse(int*);//Reverse the string 
void mycopy(int*,int*);//Copy array into array 
void mystoa(int*,int*);//Char array to ascii codes of the chars array 
void mydtobhelper(int*,int [MAXINPUTCHAR][MAXBINARYNUMERAL]);//The function that loops through and calls mydtob 
void mygetline(int*); 
void printArray(int [MAXINPUTCHAR][MAXBINARYNUMERAL]);//Print 2D array 
void mymdcp(int target[MAXINPUTCHAR][MAXBINARYNUMERAL],int* from,int targetIndex);//Copy array to 2D array 

int main(void) { 
    mygetline(thestr); 
    mystoa(thestr,theastr); 
    mydtobhelper(theastr,thebstr); 
    printArray(thebstr); 
    return 0; 
} 

void mydtobhelper(int* decimal,int target[MAXINPUTCHAR][MAXBINARYNUMERAL]){ 
    int singlenumbinary[MAXBINARYNUMERAL]; 
    for(int i=0;decimal[i];i++){ 
     mydtob(decimal[i],singlenumbinary); 
     mymdcp(target,singlenumbinary,0); 
     target[i+1][0]='\0'; 
    } 
} 

void mydtob(int decimal,int* target){ 
    int base=2; 
    int quotient=decimal; 
    int remainder=0; 
    int i=0; 
    while(quotient!=0){ 
     remainder=quotient%base; 
     quotient=quotient/base; 
     target[i]=remainder+'0'; 
     target[i+1]='\0'; 
     i++; 
    } 
    mystreverse(target); 
} 

void printArray(int arraytoprint[MAXINPUTCHAR][MAXBINARYNUMERAL]){ 
    char convertedarr[MAXINPUTCHAR][MAXBINARYNUMERAL]; 
    for(int i=0;i<MAXINPUTCHAR;i++) { 
     for(int k=0;i<MAXBINARYNUMERAL;k++){ 
      convertedarr[i][k]=arraytoprint[i][k]; 
     } 
    } 
    for(int i=0;convertedarr[i][0];i++){ 
     printf("%s",convertedarr[i]); 
    } 
} 

void mystreverse(int* str){ 
    int copiedstr[MAXINPUTCHAR]; 
    int i=0; 
    for(i=0;str[i];i++); 
    i--;  
    mycopy(str,copiedstr); 
    for (int k=i;k>=0;k--){ 
     str[k]=copiedstr[i-k]; 
    } 
    str[i+1]='\0'; 
} 

void mycopy(int* from,int* target){ 
    for(int i=0;from[i];i++){ 
     target[i]=from[i]; 
     target[i+1]='\0'; 
    } 
} 

void mystoa(int* str,int* target) { 
    for (int i = 0; str[i];i++) { 
    //printf("%d\n",i); 
    if (str[i] >= 'a' && str[i] <= 'z' || str[i]==' ' || str[i]=='\t') { 
     int n = str[i]; 
     target[i]=n; 
     target[i+1]='\0'; 
    } 
    } 
} 

void mygetline(int* target){ 
    int i=0; 
    int c=0; 
    while((c=getchar())!=EOF && c != '\n'){ 
     target[i]=c; 
     target[i+1]='\0'; 
     i++; 
    } 
} 

void mymdcp(int target[MAXINPUTCHAR][MAXBINARYNUMERAL], int* from, int targetIndex) { 
    for (int j = 0; j < from[j]; j++) { 
     target[targetIndex][j] = from[j]; 
    } 
} 
+0

где вы получаете сообщение об ошибке? и я думаю, что вы можете добиться этого с меньшим количеством кода, используя бит-манипуляцию, чтобы получить двоичные числа и ASCII, вы можете использовать перечисления или преобразование символов в int –

+0

'mystoa()' является проблемой, если 'str' было чем-то вроде '' ABC "' как target будет отсутствовать значение для target [0] '...' target [2] ', и это не будет завершено нулевым символом. Непонятно о цели функции. – chux

+0

@ Muhamed-- Пожалуйста, узнайте, как использовать отладчик. Я использовал gdb, чтобы найти ошибку, вызывающую ваш segfault буквально через 30 секунд. Вы могли бы найти это за меньшее время, чем потребовалось, чтобы задать вопрос! Вы заметите, что каждый здесь постоянно просит людей использовать отладчик. Это потому, что мы используем их все время и знаем, сколько времени они могут сэкономить. Было бы хорошо, если бы вы познакомились с рудиментами gdb или другого отладчика по вашему выбору! Положим, спасибо за публикацию полного файла, который компилируется. –

ответ

1

Неисправность сегментации была вызвана неисправной цикла в функции printArray():

for(int k=0;i<MAXBINARYNUMERAL;k++){ 
    convertedarr[i][k]=arraytoprint[i][k]; 

i в условие цикла должно быть k. При этом фиксируется, программа работает:

λ> ./a.out 
z 
1111010 
λ> ./a.out 
a 
1100001 
λ> ./a.out 
f 
1100110 

Редактировать

Я думаю, что код читаемость может быть проблемой здесь.Рассмотрим код, как он был изначально отформатирован:

void printArray(int arraytoprint[MAXINPUTCHAR][MAXBINARYNUMERAL]){ 
    char convertedarr[MAXINPUTCHAR][MAXBINARYNUMERAL]; 
    for(int i=0;i<MAXINPUTCHAR;i++) { 
     for(int k=0;i<MAXBINARYNUMERAL;k++){ 
      convertedarr[i][k]=arraytoprint[i][k]; 
     } 
    } 
    for(int i=0;convertedarr[i][0];i++){ 
     printf("%s",convertedarr[i]); 
    } 
    putchar('\n'); 
} 

по сравнению с этим:

void printArray(int arraytoprint[MAXINPUTCHAR][MAXBINARYNUMERAL]) 
{ 
    char convertedarr[MAXINPUTCHAR][MAXBINARYNUMERAL]; 

    for (int i = 0;i < MAXINPUTCHAR; i++) { 
     for (int k = 0;i < MAXBINARYNUMERAL; k++){ 
      convertedarr[i][k] = arraytoprint[i][k]; 
     } 
    } 
    for (int i = 0;convertedarr[i][0]; i++){ 
     printf("%s", convertedarr[i]); 
    } 
    putchar('\n'); 
} 

Оба эти фрагменты содержат первоначальную ошибку, но второй один делает это просто немного легче обнаружить, так как символы не совсем переполнены.

+0

Мне просто интересно, как вы нашли ошибку, которая быстрая. Я имею в виду даже хотя его отладчик. Не так ли легко найти его? –

+0

@ MuhamedCicak-- [Здесь] (https://www.cs.cmu.edu/~gilpin/tutorial/), [здесь] (http://cs.baylor.edu/~donahoo/tools/gdb/tutorial .html) и [здесь] (http://www.cs.umd.edu/~srhuang/teaching/cmsc212/gdb-tutorial-handout.pdf) являются учебники по использованию gdb. Это не место для учебника, но вкратце, я скомпилировал ваш код с помощью отладочных символов и запустил его в gdb. Когда он был отключен, gdb рассказал мне, какая функция произошла. Я не сразу увидел проблему, поэтому я ввел 'printf()', чтобы показать значения 'i' и' k', и увидел, что 'k 'просто продолжал расти. Ага! –

+0

Great.I прочитаю их. –

Смежные вопросы