C-查找句子中最长的单词

C-查找句子中最长的单词,c,text,input,C,Text,Input,嗨,我有一个程序,逐行读取文本文件,它应该输出每个句子中最长的单词。虽然它在一定程度上起作用,但它用一个同样大的词覆盖了最大的词,这是我不知道如何修复的。编辑此程序时需要考虑什么?谢谢 //Program Written and Designed by R.Sharpe #include <stdio.h> #include <stdlib.h> #include <string.h> #include "memwatch.h"

嗨,我有一个程序,逐行读取文本文件,它应该输出每个句子中最长的单词。虽然它在一定程度上起作用,但它用一个同样大的词覆盖了最大的词,这是我不知道如何修复的。编辑此程序时需要考虑什么?谢谢

//Program Written and Designed by R.Sharpe
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "memwatch.h"

int main(int argc, char** argv)
{
    FILE* file;
    file = fopen(argv[1], "r");
    char* sentence = (char*)malloc(100*sizeof(char));
    while(fgets(sentence, 100, file) != NULL)
    {
        char* word;
        int maxLength = 0;
        char* maxWord;
        maxWord = (char*)calloc(40, sizeof(char));
        word = (char*)calloc(40, sizeof(char));
        word = strtok(sentence, " ");
        while(word != NULL)
        {
            //printf("%s\n", word);
            if(strlen(word) > maxLength)
            {
                maxLength = strlen(word);
                strcpy(maxWord, word);
            }
            word = strtok(NULL, " ");
        }
        printf("%s\n", maxWord);
        maxLength = 0; //reset for next sentence;
    }

    return 0; 
}
我的输出是

text

another
reallyreallylongword
但我希望输出是

some
another
reallyreallylongword
EDIT:如果有人打算使用此代码,请记住,在修复换行符问题时,不要忘记空终止符。这是固定的设置
句子[strlen(句子)-1]=0,它实际上去掉了换行符,并用空终止符替换它。

使用

fgets(sentence, 100, file)
问题是,新行字符存储在
语句
中。例如,第一行是
“带有文本的某行”
,这使得最长的单词
“text\n”


要修复它,请在每次获得
语句

word=(char*)calloc(40,sizeof(char)),删除新行字符
是一个内存泄漏,因为在下一行你说
word=…
。我使用calloc为word分配空间,然后我给char*指针赋值,对吗?那怎么会是内存泄漏?不是。分配一些内存(
word
是指向它的指针)。然后你说
word=…
,这样你就把指针指向了分配的内存。如果您不相信我的话,只需注释掉
calloc
,它仍然可以完全一样工作;-)在
calloc()
之后,
word
将指向新创建的内存,然后在下一行中,它指向由
strok
返回的不同内存地址,因此分配的内存丢失,假设第一行是
有文本的行。
-你想要
文本。
的句点是一个长度为5的单词吗?如果没有,则需要向
strtok()
调用添加更多分隔符-换行符、制表符、各种标点符号。单引号会让事情变得棘手;是不是一两个字?他说:“那是一句台词!”其中单引号不是单词的一部分。您可以在这里做出各种合理的决定,只要您是自一致的(但“自一致”是一个或两个单词?),这可能与您正在进行的练习无关。或者让分隔符列表包括换行符(可能还有制表符,可能还有其他字符)。我删除了“\n”字符,后来让我丧命的是,我想我也删除了空终止符,这导致了看起来正确的代码出现了很多问题。将换行符替换为空终止符替换为执行语句[(strlen(句子)-1]=0@OP
句子[(strlen(句子)-1]=0
strlen(句子)的罕见情况下也有问题
'\0'
就像
'\0'
'\n'
之后的文件中存在
'\n'
一样。建议@Jonathan Leffler修改此解决方案。
fgets(sentence, 100, file)