最近三天我有问题.. 我有一个包含句子的文件。
当我用
阅读文件时void initStudent(Student* ptr, int markNum, int studentNum)
{
for (int i = 0; i < studentNum; i++)
{
cout << "Enter Student " << i+1 << " Name :";
cin >> ptr[i].name;
cout << "Enter Student ID Number :";
cin >> ptr[i].id;
ptr[i].mark = new int[markNum]
for (int j = 0; j < markNum; j++)
{
cout << "Please enter a mark :";
cin >> ptr[i].mark[j];
}
}
}
当函数addSentence将句子添加到链表中时会出现问题,因为它只添加了一个由文件中的所有内容组成的句子...
我是C的初学者。谢谢你。
答案 0 :(得分:1)
你的问题是你只能在EOF上拨打addSentence()
,所以在你读完整个文件之前,它并没有神奇地看到任何东西。据推测,你需要在检测到句子结束时调用它(通过'.'
,'?'
或'!'
的测试 - 你还需要null终止字符串在调用addSentence并使用新分配和正确大小重置内存之前以及在EOF中。不清楚为什么你有两个循环;你可能会错过一些新行作为句末。只需一个循环即可返工。
如果换行标记句子的结尾,则不完全清楚。本修订假定他们这样做:
int maxSize = 256;
int currSize = maxSize;
int i = 0;
int c;
char *sentence = (char*)malloc(maxSize);
assert(sentence != 0); // Not a production-ready error check
while ((c = fgetc(input)) != EOF)
{
sentence[i++] = c;
if ((c == '\n') || (c == '.') || (c == '?') || (c == '!'))
{
if (c != '\n')
sentence[i++] = '\n';
sentence[i] = '\0';
addSentence(sentence);
sentence = malloc(maxSize);
assert(sentence != 0); // Not a production-ready error check
currSize = maxSize;
i = 0;
}
if (i == currSize)
{
currSize = i + maxSize;
sentence = (char*)realloc(sentence, currSize);
assert(sentence != 0); // Not a production-ready error check
}
}
sentence[i] = '\0';
addSentence(sentence);
请注意,内存分配失败的错误检查不是生产质量;应该有一些正确的,无条件的错误检查。如果句子标点符号的末尾落在错误的位置,则缓冲区溢出的风险很小。生产代码也应该避免这种情况,但它会更加狡猾。我使用字符串数据类型和函数来进行添加。我可能还会猜测大多数句子都短于256个字符(特别是如果换行标记结尾),并且会使用maxSize
64
。这将导致分配更少的未使用内存。