为什么atoi无法正确转换为整数?

时间:2019-09-18 08:47:23

标签: c

我在字符串中有一个伪头,前12位是文件大小,后4位是缓冲区大小,后12位是偏移量。我想将其中的每一个都存储在一个变量中,我可以获取字符串值,但是将它们转换为整数时atoi不能正常工作 该程序如下所示:

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

void readheader(char header[29], int filesize, int buffersize, int offset) {
  char fsize[13], bsize[5], oset[13];
  memcpy(fsize, &header[0], 12);
  fsize[12] = '\0';
  memcpy(bsize, &header[12], 4);
  bsize[4] = '\0';
  memcpy(oset, &header[16], 12);
  oset[12] = '\0';
  printf("String Values: filesize: %s, buffersize: %s, offset: %s\n", fsize, bsize, os$
  filesize = atoi(fsize);
  buffersize = atoi(bsize);
  offset = atoi(oset);
}

void main() {
  char test[] = "0000000051422048000000004096";
  int a, b, c;
  readheader(test, a, b, c);
  printf("Integer values: filesize: %d, buffersize: %d, offset: %d\n", a, b, c);
}

输出看起来像这样:

String Values: filesize: 000000005142, buffersize: 2048, offset: 000000004096
Integer values: filesize: 0, buffersize: -1036019427, offset: 22039

1 个答案:

答案 0 :(得分:0)

c中的参数按值传递,如果要修改传递给函数的变量,则需要传递其内存位置,然后可以对其进行修改

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

/* Using int pointer type instead of int */
void readheader(char header[29], int* filesize, int* buffersize, int* offset) {
  char fsize[13], bsize[5], oset[13];
  memcpy(fsize, &header[0], 12);
  fsize[12] = '\0'; 
  memcpy(bsize, &header[12], 4);
  bsize[4] = '\0';  
  memcpy(oset, &header[16], 12);
  oset[12] = '\0';  
  printf("String Values: filesize: %s, buffersize: %s, offset: %s\n", fsize, bsize, oset);
  /* Dereferencing the pointers */
  *filesize = atoi(fsize); 
  *buffersize = atoi(bsize);
  *offset = atoi(oset);
}

void main() {
  char test[] = "0000000051422048000000004096";   
  int a, b, c;
  /* Passing by reference */
  readheader(test, &a, &b, &c);
  printf("Integer values: filesize: %d, buffersize: %d, offset: %d\n", a, b, c);
}