【发布时间】:2014-08-10 05:33:09
【问题描述】:
我目前正在从文件中读取单词列表并尝试逐行对它们进行排序。 我可以读入每一行并将单词打印出来,但我似乎无法单独对每一行进行排序。第一行已排序,但第二行未排序。谁能看到我哪里出错了?谢谢!
int fd;
int n_char = 0;
int charCount = 0, wordCount = 0, lineCount = 0;
int wordsPerLine[100];
char buffer;
char words[6][9];
fd = open(inputfile, O_RDONLY);
if (fd == -1) {
exit(1);
}
wordsPerLine[0] = 0;
/* use the read system call to obtain 10 characters from fd */
while( (n_char = read(fd, &buffer, sizeof(char))) != 0) {
if (buffer == '\n' || buffer == ' ') {
words[wordCount][charCount] = '\0';
charCount = 0;
wordCount++;
wordsPerLine[lineCount] += 1;
if (buffer == '\n') {
lineCount++;
wordsPerLine[lineCount] = 0;
}
} else {
words[wordCount][charCount++] = buffer;
}
}
printf("Num Words: %d --- Num Lines: %d\n", wordCount, lineCount);
char tmp[9];
int m, n;
int i, x, totalCount = 0;
for (i = 0; i < lineCount; i++) {
for (x = 0; x < wordsPerLine[i]; x++) {
/* iterate through each word 'm' in line 'i' */
for(m = 0; m < wordsPerLine[i]; m++) {
for(n = 0; n < wordsPerLine[i]; n++) {
if(strcmp(words[n-1], words[n])>0) {
strcpy(tmp, words[n-1]);
strcpy(words[n-1], words[n]);
strcpy(words[n], tmp);
}
}
} /* end sorting */
}
}
printf("Sorted:\n");
totalCount = 0;
for(i = 0; i < lineCount; i++) {
printf("Line %d (%d words)\n", i + 1, wordsPerLine[i]);
for(x = 0; x < wordsPerLine[i]; x++) {
printf("%s\n", words[totalCount++]);
}
}
我的示例输入文件是:
great day out
foo bar food
【问题讨论】:
-
你的期望输出是? “美好的一天”和“酒吧美食”?
-
你目前得到了什么?
-
如果输入的最后一行不以换行符结尾,则问题可能是您不会终止数据。 OTOH,输入文件不太可能不以换行符结尾。
-
你必须用前面所有行的
wordsPerLine的总和来索引nth 行的单词。我猜你对第一行进行了两次排序,因为你总是从 0 开始计算单词,而你应该从第二行的 3 开始计算。 (在打印单词时使用totalCount来说明这一点,但在对它们进行排序时不会。) -
另外,当
n从 0 开始时,您不应该访问words[n - 1]。使用1开始内部循环,或者使用m + 1更好。
标签: c arrays sorting multidimensional-array