c - 如何从 unsigned char 转换为 long

标签 c struct

我在从 unsigned char 转换为 long 时遇到问题。

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

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

请,只看2个函数:outPutStudentsfromDecToBinary,其他函数正常工作,并且其他函数只是获取信息并存储信息。到结构中,然后用于将详细信息打印到 output.txt 中,其中大多数都可以工作,除了二进制的东西。

input.txt 文件:

Nir 32251 99.80 11001
Ely 12347 77.89 01111
Moshe 45321 50.34 11111
Avi 31456 49.78 00011

*注意:这是不使用函数 fromDecToBinary 的输出 output.txt 文件:

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  

代码:

 #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;
}

最佳答案

fromDecToBinary 函数中存在多个错误:

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

关于c - 如何从 unsigned char 转换为 long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36807645/

相关文章:

c - 对 _sbrk 的 undefined reference

c++ - 结构数组初始化

c - C中结构成员值的自赋值

Swift 结构类型递归值

python - 通过 UDP 发送 float 结构

c - gcc错误生成

c - 如何检测未终止的注释并向代码中的标准错误流写入 "Error: line X: unterminated comment"的错误消息?

c - 在运行模块中获取 Linux 内核模块 ko 文件名

C - 为什么将结构放在 union 中?

c++ - 宏是否使代码更具可读性?