嗨我有这个代码用于将文本文件读入字符串
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-> name以包含Microsoft Coporation
,在此之后,tempString将被修改为包含Microsoft Coporation
同样,由于某种原因,不想更改的缓冲区,以及导致stuPtr->market
,stuPtr->initial
和stuPtr->stock
的缓冲区输入值都是错误的。
为什么缓冲区没有被修改就改变了?如何修复此代码才能使其正常工作?
提前感谢您的帮助
答案 0 :(得分: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()
。