strCMP与C中的文件不使用同一字符串

发布于 2025-02-08 11:57:31 字数 3615 浏览 1 评论 0原文

因此,我有一个问题,即strcmp即使字符串相同。目标和源字符串之间的CMP具有相同的字符串,但是当strcmp IT时,它不起作用。请参阅“说明”代码:

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

int main()
{
    FILE *fp;
    fp = fopen("test.txt", "r");
    char namalengkap[100], gender[100], charnamafile[50], tempat[50], temp[1000], tdeeprint[100], gendercheck;
    int umur, tb, bb, x;
    int cmp1, cmp2, cmp3, cmp4, cmp5, cmp6, check;
    float tdeenum;
    fscanf(fp, "Username : %s\nPassword : %s", tempat, temp);
    fscanf(fp, "\n\n\n=============================DATA PRIBADI USER===============================\n");
    fscanf(fp, "= Nama Lengkap       : %52[^\n] =\n", namalengkap);
    fscanf(fp, "= Jenis Kelamin      : %52[^\n] =\n", gender);
    fscanf(fp, "= Umur               : %52d =\n", &umur);
    fscanf(fp, "= Tinggi Badan (CM)  : %52d =\n", &tb);
    fscanf(fp, "= Berat  Badan (KG)  : %52d =\n", &bb);
    fscanf(fp, "= Rutinitas Olahraga : %52[^\n] =\n", tdeeprint);       
 
    fscanf(fp, "=============================================================================\n");
    cmp1 = strcmp(tdeeprint, "Jarang Berolahraga");
    cmp2 = strcmp(tdeeprint, "1 Hingga 3 Hari Dalam Seminggu");
    cmp3 = strcmp(tdeeprint, "3 Hingga 5 Hari Dalam Seminggu");
    cmp4 = strcmp(tdeeprint, "6 Hingga 7 Hari Dalam Seminggu");
    cmp5 = strcmp(tdeeprint, "Pekerjaan Fisik Berat Atau Olahraga 2x Dalam Sehari");
    if (cmp1 == 0) {
        tdeenum = 1.2;
        printf("tde1work : %f\n", tdeenum);
    } else
    if (cmp2 == 0) {
        tdeenum = 1.375;
        printf("tde2work : %f\n", tdeenum);
    } else
     if (cmp3 == 0) {
        tdeenum = 1.55;
        printf("tde3work : %f\n", tdeenum);
    } else
    if (cmp4 == 0) {
        tdeenum = 1.725;
        printf("tde4work : %f\n", tdeenum);
    } else
    if (cmp5 == 0) {
        tdeenum = 1.9;
        printf("tde5work : %f\n", tdeenum);
    }
    printf("\nUsername : %s\n", tempat);
    printf("\nPassword : %s\n", temp);
    printf("\nName : %s\n", namalengkap);
    printf("\nGender : %s\n", gender);
    printf("\nUmur : %d\n", umur);
    printf("\nTB : %d\n", tb);
    printf("\nBB : %d\n", bb);
    printf("\ntdeeprint : %s\n", tdeeprint);
    printf("\ntdeepnum : %f\n", tdeenum);
    fclose(fp);
    return 0;
}

当我运行它时:


Username : hitunga

Password : 12345

Name : a

Gender : Perempuan

Umur : 30

TB : 155

BB : 50

tdeeprint : Jarang Berolahraga

tdeepnum : 0.000000

Process returned 0 (0x0)   execution time : 0.043 s
Press any key to continue.

test.txt 文件内容:

Username : hitunga
Password : 12345

=============================DATA PRIBADI USER===============================
= Nama Lengkap       : a                                                    =
= Jenis Kelamin      : Perempuan                                            =
= Umur               : 30                                                   =
= Tinggi Badan (CM)  : 155                                                  =
= Berat  Badan (KG)  : 50                                                   =
= Rutinitas Olahraga : Jarang Berolahraga                                   =
= TDEE               : 1.200                                                = 
=============================================================================

那么我的代码上有什么问题?我真的很困惑为什么不工作。它实际上是相同的字符串比较,但不起作用。谢谢

编辑: 因此,我用fscanf替换CMP部分,但仍未得到该号码

fscanf(fp, "= TDEE               : %52.3f =\n", &datusr.tdeenum);

So I have a problem that strcmp not working even the string is same. The cmp between destination and source string is have same string, but when strcmp it, it not working. See the code for explanation:

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

int main()
{
    FILE *fp;
    fp = fopen("test.txt", "r");
    char namalengkap[100], gender[100], charnamafile[50], tempat[50], temp[1000], tdeeprint[100], gendercheck;
    int umur, tb, bb, x;
    int cmp1, cmp2, cmp3, cmp4, cmp5, cmp6, check;
    float tdeenum;
    fscanf(fp, "Username : %s\nPassword : %s", tempat, temp);
    fscanf(fp, "\n\n\n=============================DATA PRIBADI USER===============================\n");
    fscanf(fp, "= Nama Lengkap       : %52[^\n] =\n", namalengkap);
    fscanf(fp, "= Jenis Kelamin      : %52[^\n] =\n", gender);
    fscanf(fp, "= Umur               : %52d =\n", &umur);
    fscanf(fp, "= Tinggi Badan (CM)  : %52d =\n", &tb);
    fscanf(fp, "= Berat  Badan (KG)  : %52d =\n", &bb);
    fscanf(fp, "= Rutinitas Olahraga : %52[^\n] =\n", tdeeprint);       
 
    fscanf(fp, "=============================================================================\n");
    cmp1 = strcmp(tdeeprint, "Jarang Berolahraga");
    cmp2 = strcmp(tdeeprint, "1 Hingga 3 Hari Dalam Seminggu");
    cmp3 = strcmp(tdeeprint, "3 Hingga 5 Hari Dalam Seminggu");
    cmp4 = strcmp(tdeeprint, "6 Hingga 7 Hari Dalam Seminggu");
    cmp5 = strcmp(tdeeprint, "Pekerjaan Fisik Berat Atau Olahraga 2x Dalam Sehari");
    if (cmp1 == 0) {
        tdeenum = 1.2;
        printf("tde1work : %f\n", tdeenum);
    } else
    if (cmp2 == 0) {
        tdeenum = 1.375;
        printf("tde2work : %f\n", tdeenum);
    } else
     if (cmp3 == 0) {
        tdeenum = 1.55;
        printf("tde3work : %f\n", tdeenum);
    } else
    if (cmp4 == 0) {
        tdeenum = 1.725;
        printf("tde4work : %f\n", tdeenum);
    } else
    if (cmp5 == 0) {
        tdeenum = 1.9;
        printf("tde5work : %f\n", tdeenum);
    }
    printf("\nUsername : %s\n", tempat);
    printf("\nPassword : %s\n", temp);
    printf("\nName : %s\n", namalengkap);
    printf("\nGender : %s\n", gender);
    printf("\nUmur : %d\n", umur);
    printf("\nTB : %d\n", tb);
    printf("\nBB : %d\n", bb);
    printf("\ntdeeprint : %s\n", tdeeprint);
    printf("\ntdeepnum : %f\n", tdeenum);
    fclose(fp);
    return 0;
}

When I run it:


Username : hitunga

Password : 12345

Name : a

Gender : Perempuan

Umur : 30

TB : 155

BB : 50

tdeeprint : Jarang Berolahraga

tdeepnum : 0.000000

Process returned 0 (0x0)   execution time : 0.043 s
Press any key to continue.

The test.txt file content:

Username : hitunga
Password : 12345

=============================DATA PRIBADI USER===============================
= Nama Lengkap       : a                                                    =
= Jenis Kelamin      : Perempuan                                            =
= Umur               : 30                                                   =
= Tinggi Badan (CM)  : 155                                                  =
= Berat  Badan (KG)  : 50                                                   =
= Rutinitas Olahraga : Jarang Berolahraga                                   =
= TDEE               : 1.200                                                = 
=============================================================================

So what wrong on my code? I really confused why isn't working. It is literally same string comparison but not working. Thank you

Edit:
So I replace the cmp section with fscanf, but still not getting the number

fscanf(fp, "= TDEE               : %52.3f =\n", &datusr.tdeenum);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

橘香 2025-02-15 11:57:31

如果将printf语句更改为此,则问题可能会变得很清楚:

 printf("\ntdeeprint : '%s'\n",tdeeprint);

输出摘要:

tdeeprint : 'Jarang Berolahraga                                  '

同样适用于namalengkapgender> gender%52 [^\ n]模式包括所有遵循您想要的空间字符,直到您到达=,这就是为什么它与不匹配Jarang Berolahraga

If you change your printf statement to this, the problem will likely become clear to you:

 printf("\ntdeeprint : '%s'\n",tdeeprint);

Output snippet:

tdeeprint : 'Jarang Berolahraga                                  '

The same applies to namalengkap and gender. The %52[^\n] pattern includes all the space characters that follow what you want until you get to =, that's why it doesn't match the Jarang Berolahraga.

小耗子 2025-02-15 11:57:31

关于最后一个问题,fscanf(fp,“ = tdee:%52.3f = \ n”,&amp; datusr.tdeenum)在消耗输入后最多= tdee:因为%52.3F不是有效的转换说明符: precision 字段 scanf转换。您应该只使用%52F或简单地使用%f

请注意,您的解析器非常脆弱,您不会检查这些fscanf()调用的返回值。任何不匹配都会导致输入流与您的代码不同步,然后随后拨打fscanf()将失败并将目标变量保持不变,因此是非初始化的并打印它们。

您应该更改解析方法:一种更安全的方法是一次使用fgets()一次读取文件一行,准备解析行的行:删除尾随=和落后空间,请使用sscanf()尝试匹配预期数据并检查返回值以检测和报告无效输入。

这是一个修改版本:

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

// read the next non blank line from file fp, strip trailing spaces and =
char *nextline(FILE *fp, char *buf, size_t size, int c) {
    for (;;) {
        if (!fgets(buf, size, fp)) {
            *buf = '\0';
            return buf;
        }
        size_t len = strlen(buf);
        while (len > 0 && (buf[len - 1] == '\n' || buf[len - 1] == ' ' || buf[len - 1] == c)) {
            buf[--len] = '\0';
        }
        if (*buf)
            return buf;
    }
}

int main() {
    FILE *fp = fopen("220618-test.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "cannot open test.txt: %s\n", strerror(errno));
        return 1;
    }
    char tempat[50], temp[1000];
    char namalengkap[100], gender[100], tdeeprint[100], ch[2];
    int umur, tb, bb;
    double tdeenum;
    char buf[200];
    if (sscanf(nextline(fp, buf, sizeof buf, 0), "Username : %49s", tempat) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, 0), "Password : %999s", temp) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, 0), "=============================DATA PRIBADI USER==============================%1[=]", ch) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Nama Lengkap       : %99[^\n]", namalengkap) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Jenis Kelamin      : %99[^\n]", gender) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Umur               : %d", &umur) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Tinggi Badan (CM)  : %d", &tb) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Berat  Badan (KG)  : %d", &bb) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Rutinitas Olahraga : %99[^\n]", tdeeprint) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= TDEE               : %lf", &tdeenum) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, 0), "============================================================================%1[=]", ch) != 1) {
        fprintf(stderr, "invalid input: parse error at %s\n", buf);
        return 1;
    }
    fclose(fp);

    printf("Username : %s\n", tempat);
    printf("Password : %s\n", temp);
    printf("Name : %s\n", namalengkap);
    printf("Gender : %s\n", gender);
    printf("Umur : %d\n", umur);
    printf("TB : %d\n", tb);
    printf("BB : %d\n", bb);
    printf("tdeeprint : %s\n", tdeeprint);
    printf("tdeepnum : %f\n", tdeenum);

    return 0;
}

输出:

Username : hitunga
Password : 12345
Name : a
Gender : Perempuan
Umur : 30
TB : 155
BB : 50
tdeeprint : Jarang Berolahraga
tdeepnum : 1.200000

Regarding the last question, fscanf(fp, "= TDEE : %52.3f =\n", &datusr.tdeenum) fails after consuming the input up to = TDEE : because %52.3f is not a valid conversion specifier: there is no precision field in scanf conversions. You should just use %52f or simply %f.

Note that your parser is very brittle and you do not check the return values of these fscanf() calls. Any mismatch will cause the input stream to get out of sync with your code and subsequent calls to fscanf() will fail and leave the destination variables unchanged, hence uninitialized, thus causing undefined behavior when you later compare them and print them.

You should change your parsing method: a safer approach is to read the file one line at a time with fgets(), prepare the line for parsing ie: remove the trailing = and trailing spaces, use sscanf() to try and match the expected data and check the return value to detect and report invalid input.

Here is a modified version:

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

// read the next non blank line from file fp, strip trailing spaces and =
char *nextline(FILE *fp, char *buf, size_t size, int c) {
    for (;;) {
        if (!fgets(buf, size, fp)) {
            *buf = '\0';
            return buf;
        }
        size_t len = strlen(buf);
        while (len > 0 && (buf[len - 1] == '\n' || buf[len - 1] == ' ' || buf[len - 1] == c)) {
            buf[--len] = '\0';
        }
        if (*buf)
            return buf;
    }
}

int main() {
    FILE *fp = fopen("220618-test.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "cannot open test.txt: %s\n", strerror(errno));
        return 1;
    }
    char tempat[50], temp[1000];
    char namalengkap[100], gender[100], tdeeprint[100], ch[2];
    int umur, tb, bb;
    double tdeenum;
    char buf[200];
    if (sscanf(nextline(fp, buf, sizeof buf, 0), "Username : %49s", tempat) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, 0), "Password : %999s", temp) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, 0), "=============================DATA PRIBADI USER==============================%1[=]", ch) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Nama Lengkap       : %99[^\n]", namalengkap) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Jenis Kelamin      : %99[^\n]", gender) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Umur               : %d", &umur) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Tinggi Badan (CM)  : %d", &tb) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Berat  Badan (KG)  : %d", &bb) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= Rutinitas Olahraga : %99[^\n]", tdeeprint) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, '='), "= TDEE               : %lf", &tdeenum) != 1
    ||  sscanf(nextline(fp, buf, sizeof buf, 0), "============================================================================%1[=]", ch) != 1) {
        fprintf(stderr, "invalid input: parse error at %s\n", buf);
        return 1;
    }
    fclose(fp);

    printf("Username : %s\n", tempat);
    printf("Password : %s\n", temp);
    printf("Name : %s\n", namalengkap);
    printf("Gender : %s\n", gender);
    printf("Umur : %d\n", umur);
    printf("TB : %d\n", tb);
    printf("BB : %d\n", bb);
    printf("tdeeprint : %s\n", tdeeprint);
    printf("tdeepnum : %f\n", tdeenum);

    return 0;
}

Output:

Username : hitunga
Password : 12345
Name : a
Gender : Perempuan
Umur : 30
TB : 155
BB : 50
tdeeprint : Jarang Berolahraga
tdeepnum : 1.200000
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文