比较和定义C中的字符串

时间:2015-03-31 15:55:39

标签: c

我查看了其他答案,但未能找到答案 我想比较字符串的最后一个字符和文字"%"。

  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

我的代码有问题,这很明显。但是什么?

4 个答案:

答案 0 :(得分:7)

您的案例中的问题是,fName[strlen(fName) - 1]属于char,而不是const char *strcpy()需要。另外,我们不知道此处使用的ch的类型。

考虑fNamechar类型的数组,您想要的是

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