如何从unsigned char转换为long

时间:2016-04-23 06:49:43

标签: c struct

我有问题从unsigned char转换为long。

任务:25 (unsigned char) ptr->studentArr[i].subjectStatus i = 0 unsigned char fromDecToBinary(unsigned char tmpSubjectStatus),我进入函数unsigned long 11001,我希望在该函数中将ret变为变量fprintf,然后将output.txt变为11001文件。

期望:i = 0时fprintf进入文件25,问题:它打印fromDecToBinary代替(如果我使用0函数,它会打印outPutStudents)。

:只看两个函数:fromDecToBinaryoutput.txt,其他函数正常工作,其他函数只获取信息并存储信息。然后用于将细节打印到Nir 32251 99.80 11001 Ely 12347 77.89 01111 Moshe 45321 50.34 11111 Avi 31456 49.78 00011 中的结构,大多数都可以工作,除了二进制的东西。

input.txt文件:

fromDecToBinary

*注意:这是不使用函数Student 1: Nir 32251 99.80 25 Student 2: Ely 12347 77.89 15 Student 3: Moshe 45321 50.34 31 Student 4: Avi 31456 49.78 3 的输出 output.txt文件:

 #include <stdio.h>
#include <stdlib.h>
#include <conio.h>

typedef struct Student{
    char* studentName; //Dyn. alloc. of stud. name
    long id; // ID Number
    float mark; // mark
    unsigned char subjectStatus;
}Student;

typedef struct University{
    Student* studentArr; // Dync. Alloc(Realloc) of students
    int numOfStudents; //num of students
}University;

void getStudents(University *ptr);
unsigned char stringToBinary(unsigned char tmpSubjectStatus[]);
void outPutStudents(University *ptr);
unsigned char fromDecToBinary(University *ptr);

void main()
{
    printf("Please enter details of student: (a)");
    University uni;
    getStudents(&uni); //Send address of structure University, because we want to change it not make a local copy of it
    outPutStudents(&uni);
    getch();
}
void getStudents(University *ptr)
{
    FILE *op;
    char tmpStudentName[20];
    long tmpId;
    float tmpMark;
    char tmpSubjectStatus[6];
    ptr->numOfStudents = 0;
    if ((op = fopen("input.txt", "r")) == NULL)
    {
        printf("Failed to open file.");
    }
    ptr->studentArr = (Student*)malloc(sizeof(Student));
    if (ptr->studentArr == NULL){
        printf("Error: memory was not allocated.");
        exit(1);
    }
    while (fscanf(op, "%s %ld %f %s", tmpStudentName, &tmpId, &tmpMark, tmpSubjectStatus) == 4)
    {
        ptr->numOfStudents++;
        ptr->studentArr = (Student*)realloc(ptr->studentArr, sizeof(Student) * ptr->numOfStudents); /*Additional code for Realloc fails - we didn't study!*/
        ptr->studentArr[ptr->numOfStudents - 1].studentName = (char*)malloc(sizeof(char)* strlen(tmpStudentName));

        if (!(ptr->studentArr[ptr->numOfStudents - 1].studentName)) //if we failed to allocate memory for studentName
        {
            while (ptr->numOfStudents > 0)
            {
                free(ptr->studentArr[ptr->numOfStudents - 1].studentName); //free  student name
                ptr->numOfStudents--; // decrease numOfStudents by one
            }
            free(ptr->studentArr); //if all student names are free, we need to free the array
            printf("Student name was not allocated.");
            exit(1);
        }

        strcpy(ptr->studentArr[ptr->numOfStudents - 1].studentName, tmpStudentName);
        ptr->studentArr[ptr->numOfStudents - 1].id = tmpId;
        ptr->studentArr[ptr->numOfStudents - 1].mark = tmpMark;
        ptr->studentArr[ptr->numOfStudents - 1].subjectStatus = stringToBinary(tmpSubjectStatus); //atoi: from "11001"(string) to 11001(int),then casting to unsigned char
    }

    fclose(op);
}
void outPutStudents(University *ptr)
{
    int i;
    FILE *fp;
    unsigned char tmpSubjectStatus;
    long val;
    if ((fp = fopen("output.txt", "w")) == NULL)
    {
        printf("Couldn't open output file.");
        exit(1);
    }
    for (i = 0; ptr->numOfStudents != i; i++){
        tmpSubjectStatus = ptr->studentArr[i].subjectStatus;
        val = fromDecToBinary(tmpSubjectStatus);
        fprintf(fp, "Student %d: %s %ld %.2f %ld  \n", i + 1, ptr->studentArr[i].studentName, ptr->studentArr[i].id, ptr->studentArr[i].mark, tmpSubjectStatus);
    }
    fclose(fp);
}

unsigned char stringToBinary(char tmpSubjectStatus[])
{
    unsigned char tmpBinaryCh = 0;
    int i;
    for (i = 0; i < 5; i++){
        if (tmpSubjectStatus[i] == '1') tmpBinaryCh += 1 << (4 - i);
    }

    return tmpBinaryCh;
}

unsigned char fromDecToBinary(unsigned char tmpSubjectStatus)
{
    int i;
    long ret;
    char arrBinary[6];
    for (i = 0; i < 5; i++){
        arrBinary[4 - i] = tmpSubjectStatus % 2;
        tmpSubjectStatus /= 2;
    }
    arrBinary[5] = '/0';

    ret = strtol(arrBinary, NULL, 10);
    return ret;
}

代码:

$myFirstArray

3 个答案:

答案 0 :(得分:1)

fromDecToBinary函数中有几个错误:

  • '/0'替换为'\0'
  • '0' + tmpSubjectStatus % 2存储在数组中。
  • strtol电话添加正确的错误处理。
  • 将返回类型更改为long

答案 1 :(得分:0)

如果您想使用数字打印一些二进制文件,请使用此功能。

#include <stdio.h>
#include <stdlib.h>

void print_bin(uint64_t num, size_t bytes) {
  int i = 0;
  for(i = bytes * 8; i > 0; i--) {
    (i % 8 == 0) ? printf("|") : 1;
    (num & 1)    ? printf("1") : printf("0");
    num >>= 1;
  }
  printf("\n");
}

int main(void) {
  int arg = atoi("25");
  print_bin(arg, 1);
  return 0;
}

它还会每8位打印一个垂直条,以使字节更容易阅读,但您可以删除它。

如果要指定要使用此字节的字节数

#include <stdio.h>
#include <stdlib.h>

void print_bin(uint64_t num, size_t bytes) {
  int i = 0;
  for(i = bytes * 8; i > 0; i--) {
    (i % 8 == 0) ? printf("|") : 1;
    (num & 1)    ? printf("1") : printf("0");
    num >>= 1;
  }
  printf("\n");
}

int main(void) {
  print_bin(16000, 3); 
  return 0;
}

答案 2 :(得分:0)

#include <stdio.h>

int main()
{
unsigned char tmpSubjectStatus=25;
long quotient = tmpSubjectStatus;
long remainder;
long binary=0;
long multiplier=1;

while(quotient!=0){
     remainder=quotient % 2;
     binary=binary+(remainder*multiplier);
     multiplier=multiplier*10;
     quotient = quotient / 2;
}
     printf("%ld",binary);

return 0;
}

试试这个。 在函数中它将是这样的

long fromDecToBinary(unsigned char tmpSubjectStatus)
{
long quotient = tmpSubjectStatus;
long remainder;
long binary=0;
long multiplier=1;

while(quotient!=0){
     remainder=quotient % 2;
     binary=binary+(remainder*multiplier);
     multiplier=multiplier*10;
     quotient = quotient / 2;
}

return binary;
}

此处返回类型更改为long。