如何在if语句中使用strcmp进行比较
How to use strcmp in if statement to compare
我正在尝试创建一个从 .ini 文件读取数据的 C 程序。数据被读入一个名为 buffer 的变量。 .ini 文件中的数据如下所示:
[key]
title= A, H, D, F
我的程序是这样的:
LPCSTR ini = "C:\conf.ini";
char var[100];
GetPrivateProfileString("key", "title", 0, var, 100, ini);
char* buffer = strtok(var, ",");
printf("The complete line is %s", var);
buffer=strtok(NULL, ",");
printf(buffer);
while((buffer= strtok(NULL, ","))!=NULL)
printf(buffer);
输出看起来像这样:
The complete line is A, H, D, F
A
H
D
F
现在我要做的是将 'buffer' 中收到的每个字母与字符 'A' 进行比较,如果是,则打印是,否则打印否。我尝试使用 strcmp 进行比较但是 .exe 文件停止了 运行.
if (strcmp(buffer, "A")==0)
printf("Hello")
从您的输入格式来看,存在空格,您没有将其视为分隔符的一部分。因此,预计这些空格将出现在指向 bu buffer
的字符串中。你可以做
- 将分隔符更改为
" ,"
- 写
if (strcmp(buffer, " A")==0)
等等
也就是说,
printf(buffer);
是一种糟糕的风格。要么使用 puts(buffer)
要么更喜欢 printf("%s", buffer)
.
- 在使用 returned 指针之前,检查来自
strtok()
的 NULL
return。
以下是我对您的代码所做的一些修复:
我将 strcmp()
检查放在循环内,以便检查从 strtok()
提取的所有字符串片段是否与 "A"
.[=30= 相等]
分隔符之前的第一个字符串被提取到buffer
,然后它继续从buffer
提取直到NULL
在do-while
循环中。
由于您的 ini
文件的值的格式为 space- 在逗号 (", "
) 之后,我将分隔符从 ","
更改为", "
(逗号后加space).
尽管它不会对检查与 "A"
的相等性产生太大影响,因为 A
不会受到影响 (因为它位于值的第一部分 A, H, D, F
), 检查逗号和space 之间的字母值(如H
, D
, F
) 如果我们使用 ","
(仅逗号) 作为分隔符,将会受到影响。
修改代码
#include <stdio.h>
#include <windows.h>
int main() {
LPCSTR ini = "C:\conf.ini";
char var[100];
GetPrivateProfileString("key", "title", NULL, var, sizeof var, ini);
printf("The complete line is %s\n", var);
// first piece of string (letter) before delimiter
// changed delimiter from "," to ", "
char* buffer = strtok(var, ", ");
// exits if buffer is NULL
if ( !buffer )
return;
do {
// prints the letter
printf("%s", buffer);
// checking if the extracted piece of code from var is equal with "A",
// prints either " Yes" or " No"
( !strcmp(buffer, "A") ) ? puts(" Yes") : puts(" No");
// continues checking until NULL
} while( buffer = strtok(NULL, ", ") );
}
输出
The complete line is A, H, D, F
A Yes
H No
D No
F No
我正在尝试创建一个从 .ini 文件读取数据的 C 程序。数据被读入一个名为 buffer 的变量。 .ini 文件中的数据如下所示:
[key]
title= A, H, D, F
我的程序是这样的:
LPCSTR ini = "C:\conf.ini";
char var[100];
GetPrivateProfileString("key", "title", 0, var, 100, ini);
char* buffer = strtok(var, ",");
printf("The complete line is %s", var);
buffer=strtok(NULL, ",");
printf(buffer);
while((buffer= strtok(NULL, ","))!=NULL)
printf(buffer);
输出看起来像这样:
The complete line is A, H, D, F
A
H
D
F
现在我要做的是将 'buffer' 中收到的每个字母与字符 'A' 进行比较,如果是,则打印是,否则打印否。我尝试使用 strcmp 进行比较但是 .exe 文件停止了 运行.
if (strcmp(buffer, "A")==0)
printf("Hello")
从您的输入格式来看,存在空格,您没有将其视为分隔符的一部分。因此,预计这些空格将出现在指向 bu buffer
的字符串中。你可以做
- 将分隔符更改为
" ,"
- 写
if (strcmp(buffer, " A")==0)
等等
也就是说,
printf(buffer);
是一种糟糕的风格。要么使用puts(buffer)
要么更喜欢printf("%s", buffer)
.- 在使用 returned 指针之前,检查来自
strtok()
的NULL
return。
以下是我对您的代码所做的一些修复:
我将
strcmp()
检查放在循环内,以便检查从strtok()
提取的所有字符串片段是否与"A"
.[=30= 相等]分隔符之前的第一个字符串被提取到
buffer
,然后它继续从buffer
提取直到NULL
在do-while
循环中。由于您的
ini
文件的值的格式为 space- 在逗号 (", "
) 之后,我将分隔符从","
更改为", "
(逗号后加space).尽管它不会对检查与
"A"
的相等性产生太大影响,因为A
不会受到影响 (因为它位于值的第一部分A, H, D, F
), 检查逗号和space 之间的字母值(如H
,D
,F
) 如果我们使用","
(仅逗号) 作为分隔符,将会受到影响。
修改代码
#include <stdio.h>
#include <windows.h>
int main() {
LPCSTR ini = "C:\conf.ini";
char var[100];
GetPrivateProfileString("key", "title", NULL, var, sizeof var, ini);
printf("The complete line is %s\n", var);
// first piece of string (letter) before delimiter
// changed delimiter from "," to ", "
char* buffer = strtok(var, ", ");
// exits if buffer is NULL
if ( !buffer )
return;
do {
// prints the letter
printf("%s", buffer);
// checking if the extracted piece of code from var is equal with "A",
// prints either " Yes" or " No"
( !strcmp(buffer, "A") ) ? puts(" Yes") : puts(" No");
// continues checking until NULL
} while( buffer = strtok(NULL, ", ") );
}
输出
The complete line is A, H, D, F
A Yes
H No
D No
F No