我查看了其他答案,但未能找到答案 我想比较字符串的最后一个字符和文字"%"。
strcpy(ch, fName[strlen(fName) - 1]);
printf("%d\n", strcmp(ch, "%"));
我想使用cl命令行编译器(MicroSoft)进行编译,并收到警告:
cbx_test1.c(43) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char'
cbx_test1.c(43) : warning C4024: 'strcpy' : different types for formal and actual parameter 2
我的代码有问题,这很明显。但是什么?
答案 0 :(得分:7)
您的案例中的问题是,fName[strlen(fName) - 1]
属于char
,而不是const char *
,strcpy()
需要。另外,我们不知道此处使用的ch
的类型。
考虑fName
是char
类型的数组,您想要的是
if ('%' == fName[strlen(fName)-1])
//do something
答案 1 :(得分:2)
首先你需要考虑c中的字符串,是非nul
字节后跟nul
字节的序列,你试图用strcpy()
复制一个字符,这意味着复制字符串,这就是你的编译器抱怨的原因。
你可以通过简单的转让来做到这一点,即
char ch;
size_t length;
length = strlen(fname);
ch = fname[length - 1];
然后您可以将ch
与'%'
字符常量进行比较,例如
printf("%d\n", (ch == '%'));
请注意单引号,虽然没有必要,但你想做的事情可能就像这样
char ch[2];
size_t length;
length = strlen(fname);
strcpy(ch, &fname[length - 1]);
printf("%d\n", strcmp(ch, "%"));
注意两个字符分配给"%"
成为字符串,因为它需要终止nul
字节,如%\0
,你不需要需要在使用像"%"
这样的字符串文字时明确指定它,因为它是隐含的。
你也可以使用memcmp()
,在这种情况下也不是必需的,但我认为有趣的是strcmp()
不是比较c中两个字符串的唯一方法,你可以 1
char ch[1];
size_t length;
length = strlen(fname);
ch[0] = fname[length - 1];
printf("%d\n", memcmp(ch, fname + length - 1, 1));
请注意,在这种情况下,不需要终止'\0'
,因为我们指示memcmpt()
仅比较1个字节。
1 请注意,fname + length - 1
相当于&fname[length - 1]
答案 2 :(得分:1)
如果fName[]
是一个字符数组,那么你的代码是
strcpy(ch, fName[strlen(fName) - 1]);
是错误的,因为strcpy()
期望一个字符数组(或换句话说,const char *
)作为参数,而不是单个字符。
如果你只想检查一个字符,那么if语句就足够了,比如
if ( fName[strlen(fName) - 1] == '%' )
答案 3 :(得分:1)
问题出在两个方面。
strcpy(ch, fName[strlen(fName) - 1]);
strcpy
希望两个参数都为char *
。但两个争论都不是char *。用
ch = fName[strlen(fName) - 1];
printf("%d\n", strcmp(ch, "%"));
我想在这一行中你想看到strcmp的结果是0
,它验证了ch等于'%'
。以下应该适合你
if(fName[strlen(fName) - 1] == '%')
//do something
OR 使用第一个语句的代码
if (ch == '%')
//Do something