来自Java背景我正在学习C,但我发现那些模糊的编译器错误消息越来越令人沮丧.这是我的代码:
/* * PURPOSE * Do case-insensetive string comparison. */ #include#include #include int compareString(char cString1[], char cString2[]); char strToLower(char cString[]); int main() { // Declarations char cString1[50], cString2[50]; int isEqual; // Input puts("Enter string 1: "); gets(cString1); puts("Enter string 2: "); gets(cString2); // Call isEqual = compareString(cString1, cString2); if (isEqual == 0) printf("Equal!\n"); else printf("Not equal!\n"); return 0; } // WATCH OUT // This method *will* modify its input arrays. int compareString(char cString1[], char cString2[]) { // To lowercase cString1 = strToLower(cString1); cString2 = strToLower(cString2); // Do regular strcmp return strcmp(cString1, cString2); } // WATCH OUT // This method *will* modify its input arrays. char strToLower(char cString[]) { // Declarations int iTeller; for (iTeller = 0; cString[iTeller] != '\0'; iTeller++) cString[iTeller] = (char)tolower(cString[iTeller]); return cString; }
这会产生两个警告.
赋值从整数中生成没有强制转换的指针
cString1 = strToLower(cString1);
cString2 = strToLower(cString2);
return从指针生成整数而不进行强制转换
return cString;
有人可以解释这些警告吗?
C字符串不像Java字符串.它们本质上是字符数组.
您收到错误是因为strToLower返回一个char.char是C中的整数形式.您将它分配给char [],它是一个指针.因此"将整数转换为指针".
你的strToLower完成了所有的更改,没有理由返回任何东西,特别是不是char.你应该"返回"void或char*.
在调用strToLower时,也不需要赋值,你实际上只是传递cString1的内存地址.
根据我的经验,对于任何来自Java/C#背景的人来说,C语言中的字符串最难学习.人们可以与内存分配相处(因为即使在Java中,您也经常分配数组).如果你的最终目标是C++而不是C,你可能更愿意关注C字符串,确保你理解基础知识,并且只使用STL的C++字符串.
用strtolower的返回类型应该是char*
没有char
(或者它应该返回什么都没有,因为它不重新分配的字符串)