gpt4 book ai didi

c - 从 stdin 读取的段错误(核心转储)

转载 作者:太空宇宙 更新时间:2023-11-04 04:50:30 25 4
gpt4 key购买 nike

我正在尝试计算文件中每个单词的数量。该文件可以是标准输入或命令行上提供的文件名 (./count -f)。到目前为止,程序在从命令行读取文件时给出了正确的输出。但是当我试图从 stdin 读取时发生错误。程序先输出正确,然后给出Segmentation fault (core dumped)。这是我的代码的一部分。

    FILE * fp;
int size = 20000;
char sentence[2000]; // the sentence from stdin
if ( argc != 3 )
{
fgets(sentence,sizeof(sentence),stdin); // read from stdin
fflush(stdin);
// I think the initialization of word is incorrect, but i do know why it is incorrect
char *word = strtok (sentence," !\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~\n\t");
while (word != NULL)
{
get_word(word); // get each word
word = strtok (NULL, " !\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~\n\t");
}
}
else
{
fp = fopen( argv[2], "r" );
if ( fp == 0 )
{
printf( "Could not open file\n" );
}

char word[1000];
while (readFile(fp, word, size)) { // let the program read the file
get_word(word); // get each word. Works well.
}
}

get_word 函数:

void get_word(char *word){
node *ptr = NULL;
node *last = NULL;

if(first == NULL){
first = add_to_list(word); // add to linked list
return;
}

ptr = first;
while(ptr != NULL){
if(strcmp(word, ptr->str) == 0){
++ptr->freq;
return;
}
last = ptr;
ptr = ptr->next;
}
last->next = add_to_list(word); // add to linked list

请帮我弄清楚为什么我会出现段错误(核心已转储)。该程序适用于我的 mac,但不适用于 Linux。
提前致谢。

最佳答案

问题是

int main (int argc, char *argv[]) {
FILE * fp;

if ( argc != 3 )
{
fgets(sentence,sizeof(sentence),stdin);
// and so on
}
else
{
fp = fopen( argv[2], "r" );
if ( fp == 0 )
{
printf( "Could not open file\n" );
}
while (readFile(fp, word, size)) {
get_word(word);
}
}

// do some stuff, sorting etc.

fclose(fp);

fclose(fp) 不管它是否被打开。如果 fp 未连接到有效流,则通常会出现段错误。显然,一些实现可以优雅地处理 fcloseNULL 参数,这就是它看起来可以在 Mac 上工作的原因。

fclose 调用移至 else 分支,当 fopen 失败时,不要只是

printf( "Could not open file\n" );

但结束程序。

关于c - 从 stdin 读取的段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15910444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com