所以我有一個問題,strcmp即使字串相同也不能作業。目標字串和源字串之間的 cmp 具有相同的字串,但是當strcmp它出現時,它不起作用。解釋見代碼:
# 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 : R[^\n] =\n", namalengkap);
fscanf(fp, "= Jenis Kelamin : R[^\n] =\n", gender);
fscanf(fp, "= Umur : Rd =\n", &umur);
fscanf(fp, "= Tinggi Badan (CM) : Rd =\n", &tb);
fscanf(fp, "= Berat Badan (KG) : Rd =\n", &bb);
fscanf(fp, "= Rutinitas Olahraga : R[^\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 =
=============================================================================
那么我的代碼有什么問題?我真的很困惑為什么不起作用。它實際上是相同的字串比較,但不起作用。謝謝
編輯:
所以我用 替換 cmp 部分fscanf,但仍然沒有得到數字
fscanf(fp, "= TDEE : R.3f =\n", &datusr.tdeenum);
uj5u.com熱心網友回復:
如果您將您的printf陳述更改為此,您可能會清楚問題:
printf("\ntdeeprint : '%s'\n",tdeeprint);
輸出片段:
tdeeprint : 'Jarang Berolahraga '
這同樣適用于namalengkap和gender。該R[^\n]模式包括您想要的所有空格字符,直到您到達 =,這就是它與 . 不匹配的原因Jarang Berolahraga。
uj5u.com熱心網友回復:
關于最后一個問題,fscanf(fp, "= TDEE : R.3f =\n", &datusr.tdeenum)在使用輸入后失敗,= TDEE : 因為R.3f不是有效的轉換說明符:轉換中沒有精度欄位scanf。您應該只使用Rf或簡單地使用%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 : Is", tempat) != 1
|| sscanf(nextline(fp, buf, sizeof buf, 0), "Password :
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/493600.html
下一篇:如何獲取串列中的檔案路徑?
