Я пытаюсь сделать программу, которая преобразует слово в двоичные числа. Например:Слово для двоичных чисел программа в 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];
}
}
где вы получаете сообщение об ошибке? и я думаю, что вы можете добиться этого с меньшим количеством кода, используя бит-манипуляцию, чтобы получить двоичные числа и ASCII, вы можете использовать перечисления или преобразование символов в int –
'mystoa()' является проблемой, если 'str' было чем-то вроде '' ABC "' как target будет отсутствовать значение для target [0] '...' target [2] ', и это не будет завершено нулевым символом. Непонятно о цели функции. – chux
@ Muhamed-- Пожалуйста, узнайте, как использовать отладчик. Я использовал gdb, чтобы найти ошибку, вызывающую ваш segfault буквально через 30 секунд. Вы могли бы найти это за меньшее время, чем потребовалось, чтобы задать вопрос! Вы заметите, что каждый здесь постоянно просит людей использовать отладчик. Это потому, что мы используем их все время и знаем, сколько времени они могут сэкономить. Было бы хорошо, если бы вы познакомились с рудиментами gdb или другого отладчика по вашему выбору! Положим, спасибо за публикацию полного файла, который компилируется. –