2013-08-06 53 views
0

您好我有这样的代码读取文本文件转换成字符串读取数据文件转换成字符串中使用字符串标记

void addStu (BST_TREE* list) 
{ 
// Local Declarations 
    COMPANY* stuPtr; 
    FILE* fp; 
    int i = 0; 
    char fileName[25]; 
    char buffer [100]; 
    char* tempString; 
// Statements 

    stuPtr = (COMPANY*)malloc (sizeof (COMPANY)); 
    stuPtr->name = (char*) malloc(128 * sizeof(char)); 
    stuPtr->market = (char*) malloc(128 * sizeof(char)); 
    stuPtr->initial = (char*) malloc(128 * sizeof(char)); 
    tempString = (char*) malloc(128 * sizeof(char)); 

    printf("Enter the file name: "); 
      gets(fileName); 
      fp = fopen(fileName, "r"); 
      if(fp == NULL) 
      { 
       printf("Error cannot open the file!\n"); 
       exit(101); 
      } 
    while(fgets(buffer, 100, fp) != NULL) 
     { 
      if (!stuPtr) 
       printf("MEmory overflow!\n"), exit(101); 
      tempString = buffer; 
      stuPtr->name = strtok(tempString, ";"); 
      sscanf(buffer, "%15s %15s %f ", stuPtr->market, stuPtr->initial, &(stuPtr->stock)); 
      BST_Insert(list, stuPtr); 
      i++; 
     } // end while 

} //addStu 

这个代码不正确,因为缓冲工作不断变化的时候我甚至没有修改

这是我输入

Microsoft Corporation; NASDAQ MSFT 259.94B 
Yahoo! Inc.;    NASDAQ YHOO 37.67B 
Baidu.com, Inc. (ADR); NASDAQ BIDU 8.64B 
CNET Networks, Inc.;  NASDAQ CNET 1.13B 
QuickLogic Corporation; NASDAQ QUIK 88.62M 
Answers Corporation;  NASDAQ ANSW 53.49M 
Apple Inc.;    NASDAQ AAPL 114.17B 

例如,当我试图读取第一线,我能得到stuPtr->名使用字符串令牌包含Microsoft Coporation,这点T之后他tempString将被修改为包含Microsoft Coporation以及由于某种原因,该缓冲区没有被更改,导致stuPtr->market,stuPtr->initialstuPtr->stock有错误的输入值。

为什么缓冲区改变而不被修改?我怎样才能修复这个代码,使其工作?

感谢您帮助

回答

0

strtok()有OP意想不到的副作用。

stuPtr->name = strtok(tempString, ";");之后,buffer之前由';'被替换为'\ 0'。所以当调用sscanf(buffer, "%15s ...时,会发生意外的结果。建议:考虑混合strtok()和'sscanf()`以外的其他选择。

一个可以继续使用sccanf()

sscanf(&buffer[strlen(stuPtr->name)+1], "%15s ... 

但建议仅sscanf()解决一个strtok()strtof()