簡體   English   中英

在C中比較和定義字符串

[英]comparing and defining strings in 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

我的代碼有問題,這很明顯。 但是呢

您遇到的問題是, fName[strlen(fName) - 1]屬於char類型,而不是strcpy()需要的const char *類型。 另外,我們不知道這里使用的ch的類型。

考慮fNamechar類型的數組,您想要的是

if ('%' == fName[strlen(fName)-1])
   //do something

首先,您需要考慮c中的字符串是非nul字節的序列,然后是nul字節的序列,您嘗試使用strcpy()復制一個字符,該字符用於復制string ,因此這就是編譯器抱怨的原因。

您可以通過簡單的分配來做到這一點,即

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]

如果fName[]是字符數組,則您的代碼

strcpy(ch, fName[strlen(fName) - 1]);

這是錯誤的,因為strcpy()希望將字符數組(或換句話說, const char * )作為參數而不是單個字符。

如果只想檢查一個字符,那么if語句就足夠了,例如

if ( fName[strlen(fName) - 1] == '%' )

問題出在兩行。

strcpy(ch, fName[strlen(fName) - 1]);

strcpy希望兩個參數都為char * 但是,兩種論點都不是字符*。 將此語句替換為

ch = fName[strlen(fName) - 1];

printf("%d\\n", strcmp(ch, "%"));

我認為在這一行中,您希望看到strcmp的結果為0 ,這證明ch等於'%' 以下應該為您工作

if(fName[strlen(fName) - 1] == '%')
//do something

或將代碼用於第一條語句

if (ch == '%')
//Do something

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM