我在从 unsigned char 转换为 long 时遇到问题。
任务: 当 i = 时,我在
,我进入函数 (unsigned char) ptr->studentArr[i].subjectStatus
中有 25
0unsigned char fromDecToBinary(unsigned char tmpSubjectStatus)
,我希望在该函数中将 unsigned long 11001
获取到变量 ret
,然后 fprintf
将其写入 output.txt
文件。
期望:当i = 0
时将fprintf写入文件11001
,问题:它打印25
(如果我使用 fromDecToBinary
函数,它会打印 0
)。
请,只看2个函数:outPutStudents
和fromDecToBinary
,其他函数正常工作,并且其他函数只是获取信息并存储信息。到结构中,然后用于将详细信息打印到 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/