如何只得到字符串的第一个单词,然后在c中将其与另一个单词进行比较?

eqqqjvef  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(136)

我必须在一个文件中获取字符串的第一个单词,并将其与一些单词进行比较,如果它们与单词相同,我将其与它进行比较,计数器将递增,然后在末尾显示每个单词的数量。我总是以正确的数量获取前两个单词,其他单词为0,或所有0
试着这样做:

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

int main() {
    FILE *fpl = fopen("your_file.txt", "r");
    if (fpl != NULL) {
        printf("File opened\n");

        char vetor[500];
        char firstword[11];
        int alamedas = 0;

        while (fgets(vetor, 500, fpl)) {
            for (int i = 0; i < 100; i++) {
                if (vetor[i] == 'A' && vetor[i + 6] == 'a') {
                    int n = 0;
                    while (n < 7) {
                        firstword[n] = vetor[i];
                        i++;
                        n++;
                    }
                    firstword[n] = '\0';  
                    if (strcmp("Alameda", firstword) == 0) {
                        alamedas += 1;
                    }
                }
            }
        }

        fclose(fpl);
        printf("Alamedas - %d\n", alamedas);
    } else {
        printf("Can't open file\n");
    }

    return 0;
}

字符串
然后如果我添加另一个if,就像第一个for之后的第一个if,它不会添加到自己的计数中,不知道为什么。

x759pob2

x759pob21#

关于你的代码的一些评论:

  • 你用fgets()函数从文件中获取数据到vetor[],如果文件中每个字符串有1个单词是合理的,但它看起来还是有点乱。更干净的解决方案是使用fscanf(fpl, "%s", vetor)-这样它会扫描1个单词,用空格/换行符/制表符与其他单词分隔开....下次你使用这个函数时,它会读取下一个单词,如果没有单词,它将返回0,while-loop将停止。
  • 好了,我们已经扫描了单词,但是我们怎么知道它是不是第一个呢?为此,我们可以在while循环之前创建一个标志:
int first_word_readen = 0; 
    while (fscanf(...))
    {
        if (first_word_readen == 0)
        {
            strcpy(firstword, vetor); // copy string firstword = vetor
            first_word_readen = 1;    // so this "if" will never work again after 
        }                             // that
    
        if (strcmp("Alameda", vetor) == 0) // then you compare 
            alamedas += 1;
    }

字符串

  • 在代码的开头,你有以下代码块:
if (fpl != NULL) {
        printf("File opened\n");
    
        // ...
       } else {
         printf("Can't open file\n");
       }


你可以简单地通过“反转”它来使它更具可读性:

if (fpl == NULL) {
        printf("Can't open file\n");
        return 0; // stop the program
    }
    // if "if" above didnt stop the program - it means that fpl != NULL
    printf("File opened\n");
    // your code


我希望我得到了正确的问题,你的第一个解决方案是有点直截了当,我会建议阅读标准string.h函数,如strcpy()(顺便说一句。你已经在你的代码中写了一个自己的:)。此外,你有太多的{{},这导致非常复杂的代码不可持续的代码。尝试将你的代码划分为函数,你会读起来容易得多。
解决方案应该总是漂亮和漂亮的小!祝你好运

ejk8hzay

ejk8hzay2#

几件事:

  • 第一个月

假设,如果输入文件中的一行有超过500个字符,在这种情况下,您将得到不正确的输出,因为在下一次迭代中,fgets()将读取它在上一次调用中读取的同一行的其余部分。

  • for (int i = 0; i < 100; i++)

这个for循环没有任何意义。在从文件中阅读一行/字符串之后,这个循环将在vetor缓冲区中搜索所有出现的子字符串(直到第一个100字符),该子字符串具有当前处理的字母A,从中,第七个字母是a,然后将这些字符复制到另一个缓冲区中,并与字符串"Alameda"进行比较。
如果您的目标是将文件每行的第一个单词与一个单词进行比较,然后从fgets()读取数据的缓冲区中提取第一个单词,为了提取第一个单词,忽略缓冲区开头的任何空白字符,一旦找到字母表,读到你找到一个空白字符为止。把这些字母复制到一个缓冲区中,然后和你想要计数的单词进行比较。你也可以使用fscanf()作为替代读取字符串的第一个字,前提是你知道传递fscanf()的正确格式说明符。
要读取文件并将文件每行的第一个单词与一个单词进行比较并打印该单词的计数,您可以执行以下操作:

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

int main (void) {
    FILE * fp = fopen ("test.txt", "r");

    if (fp == NULL) {
        printf ("Failed to open file\n");
        return 0;
    }

    char firstword[100];
    int alamedas = 0;

    while (fscanf(fp, "%99s%*[^\n]", firstword) == 1) {
        if (strcmp ("Alameda", firstword) == 0) {
            alamedas += 1;
        }
    }

    fclose (fp);
    printf("Alamedas - %d\n", alamedas);

    return 0;
}

字符串
除了fscanf()说明符字符串-"%99s%*[^\n]"之外,程序相当简单。在此格式说明符中,%99s将忽略初始空白字符(如果有的话),然后读取buffer中的第一个字(数字99表示如果word大于99个字符,则最多读取99个字符,这是为了防止缓冲区溢出),%*[^\n]将忽略该行的其余部分,直到一个换行符。
如果你想搜索多个单词的出现,作为文件行中的第一个单词,那么最好创建一个包含字符串和int成员的结构:

struct wc {
    char st[100];
    int cnt;
};


创建一个struct wc的数组,并使用字符串初始化它的st成员,并使用0初始化对应的cnd

struct wc arr[] = {{"Alameda", 0}, {"someword", 0}};


提取第一个单词后,在一个循环中将该单词与数组arr中的所有单词进行比较,如果它与任何单词匹配,则增加其相应的计数。完成阅读文件后,打印数组arr的成员。
如果你还有什么问题,请告诉我。

vom3gejh

vom3gejh3#

使用strcmp函数
https://www.programiz.com/c-programming/library-function/string.h/strcmp
C strcmp()strcmp()逐字符比较两个字符串。如果字符串相等,则函数返回0。

相关问题