C语言中的字转二进制数程序
Word to binary numbers program in C
我正在尝试编写将单词转换为二进制数的程序。
例如:
输入:
abcd
输出(首先是a,b,c,d的ascii码):
(ASCII CODE of a,b,c and d)
a: 97
b: 98
c: 99
d: 100
Than convert these to binary:
97: 1100001
98: 1100010
99: 1100011
100: 1100100
And finally the output should be like this:
110000|11100010|1100011|1100100
Or without the straight lines between them.
但是我收到一个错误:
输入:
a
输出:
Segmentation failed(core dumped)
代码如下:
#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]='[=10=]';
}
}
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]='[=10=]';
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]='[=10=]';
}
void mycopy(int* from,int* target){
for(int i=0;from[i];i++){
target[i]=from[i];
target[i+1]='[=10=]';
}
}
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]='[=10=]';
}
}
}
void mygetline(int* target){
int i=0;
int c=0;
while((c=getchar())!=EOF && c != '\n'){
target[i]=c;
target[i+1]='[=10=]';
i++;
}
}
void mymdcp(int target[MAXINPUTCHAR][MAXBINARYNUMERAL], int* from, int targetIndex) {
for (int j = 0; j < from[j]; j++) {
target[targetIndex][j] = from[j];
}
}
分段错误是由函数中的错误循环引起的 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');
}
这两个片段都包含原始错误,但第二个片段更容易发现,因为符号没有那么挤在一起。
我正在尝试编写将单词转换为二进制数的程序。 例如:
输入:
abcd
输出(首先是a,b,c,d的ascii码):
(ASCII CODE of a,b,c and d)
a: 97
b: 98
c: 99
d: 100
Than convert these to binary:
97: 1100001
98: 1100010
99: 1100011
100: 1100100
And finally the output should be like this:
110000|11100010|1100011|1100100
Or without the straight lines between them.
但是我收到一个错误:
输入:
a
输出:
Segmentation failed(core dumped)
代码如下:
#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]='[=10=]';
}
}
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]='[=10=]';
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]='[=10=]';
}
void mycopy(int* from,int* target){
for(int i=0;from[i];i++){
target[i]=from[i];
target[i+1]='[=10=]';
}
}
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]='[=10=]';
}
}
}
void mygetline(int* target){
int i=0;
int c=0;
while((c=getchar())!=EOF && c != '\n'){
target[i]=c;
target[i+1]='[=10=]';
i++;
}
}
void mymdcp(int target[MAXINPUTCHAR][MAXBINARYNUMERAL], int* from, int targetIndex) {
for (int j = 0; j < from[j]; j++) {
target[targetIndex][j] = from[j];
}
}
分段错误是由函数中的错误循环引起的 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');
}
这两个片段都包含原始错误,但第二个片段更容易发现,因为符号没有那么挤在一起。