c - 在 C 代码中使用 strcmp 时遇到问题

标签 c string struct strcmp

我之前使用过 strcmp 并且它按预期工作,但在我当前的代码中它不适合我。

我正在读取一个包含一群名人名字的 .csv 文件。 “Mark Zuckerberg” 是触发我的代码最终会做的事情的关键名称(一旦我越过路上的这个颠簸,这与他最近出现在新闻中的事情无关) .我正在使用计数器 (queue_size) 来计算 .csv 文件中的行数。我的目标是在 strcmp(temp_name, key) == 0 时保存计数器的值,但我没有输入 if 语句,我不明白为什么.

key 在 .csv 文件中显示为 "Mark,Zuckerberg"。我试过使用 strtok 来消除逗号。我成功地做到了这一点,但 strcmp() 仍然无法正常工作(我将 key 调整为 "MarkZuckerberg")。我还添加了 memset 来清理每次迭代的记录,但这也没有解决问题。

注释该行,temp_name[strlen(temp_name) - 1] = '\0'; 似乎也没有改变任何内容。我知道我的 struct 正在获取所有名称,因为 printf(我已经删除了)和我的 print_list 函数按预期打印。

我真的需要帮助找出为什么我没有输入 if 语句。
提前感谢任何人可以提供的任何帮助。

我认为我忽略了一些愚蠢的东西,但我就是找不到它。

这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct char_node {
    char name[40];
    struct char_node *next;
} char_node;

typedef struct char_queue {
    char_node *q_head;
    char_node *q_tail;
    int q_size;
} char_queue;

void enqueue(char_queue *q_ptr, char new_name[40]);
//int dequeue(char_queue *q_ptr);
void print_list(char_queue *queue);

int main() {
    int queue_size = 0;
    int m_z_position;
    char_queue queue;
    char temp_name[40];
    char key[] = "Mark,Zuckerberg";

    queue.q_head = NULL;
    queue.q_tail = NULL;
    queue.q_size = 0;

    FILE *file_input;
    file_input = fopen("party.csv", "r");

    memset(temp_name, '\0', sizeof(temp_name));

    while(fgets(temp_name, sizeof(temp_name), file_input)) {
        temp_name[strlen(temp_name) - 1] = '\0';
        if(strcmp(temp_name, key) == 0) {
            printf("test\n");
            m_z_position = queue_size;
        }
        enqueue(&queue, temp_name);
        memset(temp_name, '\0', sizeof(temp_name));
        queue_size++;
    }
    fclose(file_input);

//print_list(&queue);
    printf("m_z_position = %d\n", m_z_position);
    return 0;
}

void enqueue(char_queue *q_ptr, char new_name[40]) {
    char_node *new_node = (char_node*)malloc(sizeof(char_node));
    strcpy(new_node->name, new_name);
    new_node->next = NULL;
    int num;

    if(q_ptr->q_size == 0) {
        q_ptr->q_tail = new_node;
        q_ptr->q_head = new_node;
    } else {
        q_ptr->q_tail->next = new_node;
        q_ptr->q_tail = new_node;
    }
    (q_ptr->q_size)++;
    return;
}

void print_list(char_queue *queue) {
    char_node *temp_list;

    if(queue->q_head != NULL) {
        temp_list = queue->q_head;
        while(temp_list != NULL) {
            printf("%s\n", temp_list->name);
            temp_list = temp_list->next;
        }
    }
    printf("\n");
    return;
}

我不知道如何添加文件,但这是 .csv 文件的内容

Jeff,Bezo
Bill,Gates
Warren,Buffett
Berkshire,Hathaway
Bernard,Arnault
Amancio,Ortega
Carlos,Slim
Charles,Koch
David,Koch
Larry,Ellison
Michael,Bloomberg
Larry,Page
Sergey,Brin
Jim,Walton
S,Robson
Alice,Walton
Ma,Huateng
Francoise,Bettencourt
Mukesh,Ambani
Jack,Ma
Sheldon,Adelson
Steve,Ballmer
Li,Ka-shing
Hui,Ka
Lee,Shau
Wang,Jianlin
Beate,Heister
Phil,Knight
Jorge,Paulo
Francois,Pinault
Georg,Schaeffler
Susanne,Klatten
David,Thomson
Jacqueline,Mars
John,Mars
Joseph,Safra
Giovanni,Ferrero
Dietrich,Mateschitz
Michael,Dell
Masayoshi,Son
Serge,Dassault
Stefan,Quandt
Yang,Huiyan
Paul,Allen
Leonardo,Del
Dieter,Schwarz
Thomas,Peterffy
Theo,Albrecht
Len,Blavatnik
He,Xiangjian
Lui,Che
James,Simons
Henry,Sy
Elon,Musk
Hinduja,family
Tadashi,Yanai
Vladimir,Lisin
Laurene,Powell
Azim,Premji
Alexey,Mordashov
Lee,Kun-Hee
Lakshmi,Mittal
Wang,Wei
Leonid,Mikhelson
Charoen,Sirivadhanabhakdi
Pallonji,Mistry
Ray,Dalio
Takemitsu,Takizaki
William,Ding
R,Budi
Gina,Rinehart
German,Larrea
Carl,Icahn
Stefan,Persson
Michael,Hartono
Joseph,Lau
Thomas,A
Vagit,Alekperov
James,Ratcliffe
Donald,Bren
Iris,Fontbona
Gennady,Timchenko
Abigail,Johnson
Vladimir,Potanin
Lukas,Walton
Charlene,de
Zhang,Zhidong
Petr,Kellner
Andrey,Melnichenko
David,A
Klaus-Michael,Kuehne
Li,Shufu
Mikhail,Fridman
Rupert,Murdoch
Dhanin,Chearavanont
Robert,Kuok
Emmanuel,Besnier
Shiv,Nadar
Viktor,Vekselberg
Aliko,Dangote
Harold,Hamm
Steve,Cohen
Dustin,Moskovitz
Marcel,Herrmann
Reinhold,Wuerth
Charles,Ergen
Eric,Schmidt
Philip,Anschutz
Jim,Kennedy
Blair,Parry-Okeden
Alain,Wertheimer
Gerard,Wertheimer
Leonard,Lauder
Heinz,Hermann
Dilip,Shanghvi
Hasso,Plattner
Stephen,Schwarzman
Lei,Jun
Hans,Rausing
Alisher,Usmanov
Donald,Newhouse
Peter,Woo
Luis,Carlos
Robin,Li
Carlos,Alberto
Seo,Jung-Jin
Kumar,Birla
Alexander,Otto
Stefano,Pessina
Udo,A
Wang,Wenyin
Andrew,Beal
Lee,Man
John,Menard
Xu,Shihui
Zhou,Hongyi
Gong,Hongjia
Michael,Otto
David,Tepper
Roman,Abramovich
Liu,Qiangdong
Robert,A
Alberto,Bailleres
Uday,Kotak
Pierre,Omidyar
Walter,PJ
Dietmar,Hopp
Graeme,Hart
Eduardo,Saverin
Yan,Zhi
Radhakishan,Damani
German,Khan
Ronald,Perelman
Gautam,Adani
Micky,Arison
Pan,Zhengmin
Joseph,Tsai
Thomas,Frist
Mikhail,Prokhorov
Galen,Weston
Zong,Qinghou
Eyal,Ofer
Charles,Schwab
Gianluigi,A
Herbert,Kohler
Viktor,Rashnikov
Harry,Triguboff
August,von
Yao,Zhenhua
Jan,Koum
Cyrus,Poonawalla
James,Goodnight
Ken,Griffin
Giorgio,Armani
Ernesto,Bertarelli
Savitri,Jindal
Sunil,Mittal
James,Chambers
Katharine,Rayner
Margaretta,Taylor
Terry,Gou
Gordon,Moore
James,Irving
Stanley,Kroenke
Melker,Schorling
Johann,Graf
Guo,Guangchang
John,Malone
Xavier,Niel
Silvio,Berlusconi
Carl,Cook
David,Geffen
Hui,Wing
Walter,Kwok
George,Soros
Edward,Johnson
Massimiliana,Landini
David,Duffield
George,Kaiser
Patrick,Soon-Shiong
Zhou,Qunfei
Nicky,Oppenheimer
Sun,Piaoyang
Wu,Yajun
Alexei,Kuzmichev
Stephen,Ross
Vincent,Bollore
Pauline,MacMillan
Jay,Y
Anders,Holch
Eli,Broad
Michael,Kadoorie
Iskander,Makhmudov
Frederik,Paulsen
Sun,Hongbin
Christy,Walton
Shahid,Khan
Ananda,Krishnan
Carrie,Perrodo
Quek,Leng
Wang,Wenxue
John,Doerr
Patrick,Drahi
Eva,Gonda
Willi,A
Ricardo,Salinas
Suh,Kyung-Bae
Pollyanna,Chu
John,Fredriksen
Goh,Cheng
Sri,Prakash
Lu,Zhiqiang
Jorn,Rausing
Johann,Rupert
Jacques,Saade
Wu,Shaoxun
Leonid,Fedun
Kim,Jung-Ju
Sandra,Ortega
Jim,Pattison
Michael,Platt
Chan,Laiwa
David,Green
Hank,A
Dmitry,Rybolovlev
Tsai,Eng-Meng
Andreas,von
Oleg,Deripaska
Liu,Yongxing
Ludwig,Merckle
Brian,Acton
John,Grayken
Ann,Walton
Augusto,A
Finn,Rausing
Mark,Zuckerberg
Kirsten,Rausing
Odd,Reitan
Nassef,Sawiris
Wee,Cho
Aloys,Wobben
Leon,Black
Ivan,Glasenberg
John,Paulson
Wei,Jianjun
Francis,Choi
Erivan,Haub
Jason,Jiang
Suleiman,Kerimov
Ian,A
Pang,Kang
David,Shaw
Kushal,Pal
John,A
Acharya,Balkrishna
Guenther,Fielmann
Daniel,Gilbert
Antonia,Johnson
Vikram,Lal
Akira,Mori
Maria-Elisabeth,Schaeffler-Thumann
Albert,Frere
Richard,Kinder
Robert,Kraft
Ralph,Lauren
Bruno,Schroder
Nusli,Wadia
Pierre,Bellon
Les,Wexner
Benu,Gopal
David,Cheriton
Ma,Jianrong
Whitney,MacMillan
Dan,Olsson
Vivek,Chaand
Teh,Hong
Abdulla,bin
Maria,Asuncion
Ralph,Dommermuth
Frank,Lowy
Wolfgang,Marguerre
Marijke,Mars
Pamela,Mars
Valerie,Mars
Victoria,Mars
David,A
John,Gokongwei
Kwon,Hyuk-Bin
Nancy,Walton
Lin,Yu-Ling
Tom,A
Robert,Rowling
Dennis,Washington
Yao,Liangsong
Zhang,Jindong
Juan,Francisco
David,Sun
John,Tu
Martin,Viessmann
Stef,Wertheimer
Hansjoerg,Wyss
James,Dyson
Laurence,Graff
Jen-Hsun,Huang
Charles,Johnson
Jerry,Jones
Kei,Hoi
Kwee,family
Lee,Shin
Richard,LeFrak
Shigenobu,Nagamori
Steven,Rales
Friede,Springer
Yeung,Kin-man
Rinat,Akhmetov
Shari,Arison
Dannine,Avara
Rahel,Blocher
Andrew,Currie
Scott,Duncan
Milane,Frantz
Diane,Hendricks
Magdalena,Martullo-Blocher
Hiroshi,Mikitani
Gabe,Newell
Pan,Sutong
Anthony,Pratt
John,Reece
Randa,Williams
Zhang,Bangxin

最佳答案

我正在修复您的代码,但由于 this评论已经声明,您的文件使用 "\r\n" 作为结束行代码,可以用 str[strcspn(str, "\r\n")] = '\0 '; 就在你阅读之后。

但是这里是您的代码实现的另一个示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct char_node {
    struct char_node *next;
    char name[];
} char_node;

typedef struct char_queue {
    char_node *q_head;
    char_node *q_tail;
    size_t q_size;
} char_queue;

char_node *enqueue(char_queue *q_ptr, char const *new_name);
void print_list(char_queue const *queue);

int main(void) {
    char_queue queue = { .q_head = NULL, .q_tail = NULL, .q_size = 0 };
    char const key[] = "Mark,Zuckerberg";

    FILE *file_input = fopen("party.csv", "r");
    if (file_input == NULL) {
        file_input = stdin;
    }
    char str[40];
    size_t m_z_position = 0;
    while (fgets(str, sizeof str, file_input)) {
        str[strcspn(str, "\r\n")] = '\0';
        if (strcmp(str, key) == 0) {
            m_z_position = queue.q_size;
        }
        enqueue(&queue, str);
    }
    fclose(file_input);

    print_list(&queue);
    printf("m_z_position = %zu\n", m_z_position);
}

char_node *enqueue(char_queue *q_ptr, char const *name) {
    size_t i = strlen(name) + 1;
    char_node *node = malloc(sizeof *node + i);
    if (!node) {
        return NULL;
    }
    strcpy(node->name, name);
    node->next = NULL;

    if (q_ptr->q_size++ == 0) {
        q_ptr->q_tail = q_ptr->q_head = node;
    } else {
        q_ptr->q_tail = q_ptr->q_tail->next = node;
    }
    return node;
}

void print_list(char_queue const *queue) {
    for (char_node const *list = queue->q_head; list; list = list->next) {
        printf("%s\n", list->name);
    }
    printf("\n");
}

关于c - 在 C 代码中使用 strcmp 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49827383/

相关文章:

c - 如何将 memcpy() 函数与动态分配结构一起使用

go - 将结构转换为YAML文件golang,如何避免yaml输出中的空引号?

swift - 在 Swift 中使用结构进行 Duck 类型

c typedef(ed) 不透明指针

c++ - 使用 poll 系统调用等待 fds 时 CPU 使用率过高

c# - 按另一个字符串的位置对字符串进行排序

c++ - 为什么从字符串常量到 'char*' 的转换在 C 中有效但在 C++ 中无效

c - 为什么 j 在 (++i ||++j) 中不递增

c - 使用条件运算符的二次方程

PHP 从 postgresql 数据库构建特定的 JSON 字符串