我需要从文件中读取一行,找到行中最大的单词,读取下一个单词。看起来很简单。我是C的新手,所以我知道我可能会错过一些简单的东西。如果我不包含'\ n'作为分隔符,它将打印文件中的空白行(段落之间的行),如果最大的单词位于行的末尾,则将打印一个新行。如果我确实包含它,则如果后面有一个空行,则会重复该标记,并跳过文件中的最后一行。 这是代码:
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFFSIZE 81
int main(int numParms, char *parms[])
{
FILE *file;
char buffer[BUFFSIZE];
char *token;
int lineNum = 0;
int currSize = 0;
file = fopen("in.txt" , "r");
if(file == NULL)
{
perror("Error opening file");
return(-1);
}
fgets(buffer, BUFFSIZE, stdin);
while(!feof(stdin))
{
char bigWord[30];
char currWord[30];
int bigSize = 0;
lineNum++;
token = strtok(buffer, " \n\t");
while(token != NULL)
{
strcpy(currWord, token);
currSize = strlen(currWord);
if(currSize > bigSize && currSize != bigSize)
{
strcpy(bigWord, currWord);
bigSize = strlen(bigWord);
}
token = strtok(NULL, " \n\t");
}
printf("Line %d's word: %s\n", lineNum, bigWord);
fgets(buffer, BUFFSIZE, stdin);
}
fclose(file);
return(0);
}
答案 0 :(得分:0)
未初始化的缓冲区。
每当fgets()
读取仅由' '
,'\n'
或'\t'
组成的行时,printf("... %s\n", ..., bigWord);
就会打印出单位化bigWord
, simple可能有前一行解析的内容。
OP打开file
,但使用stdin
。 @BLUEPIXY
一些改进
// improved fgets() usage, catches IO error, unlike before
while (fgets(buffer, BUFFSIZE, file) != NULL) {
char bigWord[BUFFSIZE]; // Worst case size
bigWord[0] = '\0'; // Initialize bigWord
size_t bigSize = 0; // type int is OK for small buffers, but size_t is best
lineNum++;
char *token = strtok(buffer, " \n\t"); // local declaration
while(token != NULL) {
char currWord[BUFFSIZE]; // local declaration
strcpy(currWord, token);
size_t currSize = strlen(currWord); // local declaration
// Drop 2nd part of if() - not needed
// if(currSize > bigSize && currSize != bigSize) {
if(currSize > bigSize) {
strcpy(bigWord, currWord);
bigSize = strlen(bigWord); // or just use bigSize = currSize
}
token = strtok(NULL, " \n\t");
}
printf("Line %d's word: `%s`\n", lineNum, bigWord); // added ``
}
其他可能的简化:
无需char currWord[BUFFSIZE]
,只需使用token
即可。