来自Java背景的我正在学习C,但我发现那些模糊的编译器错误消息越来越令人沮丧。下面是我的代码:
/*
* PURPOSE
* Do case-insensetive string comparison.
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
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;
}
这将生成两个警告。
的情况下使指针来自整数
有人能解释一下这些警告吗?
发布于 2010-01-16 03:01:15
C字符串与Java字符串完全不同。它们本质上是字符数组。
因为strToLower返回了一个字符,所以你得到了这个错误。字符是C中整数的一种形式。你将它赋值给一个char[],它是一个指针。因此,“将整数转换为指针”。
你的strToLower做了所有的修改,它没有理由返回任何东西,尤其是不返回字符。
在调用strToLower时,也不需要赋值,本质上只是传递cString1的内存地址。
根据我的经验,对于任何从Java/ C #背景回到C的人来说,C中的字符串是最难学习的部分。人们可以适应内存分配(因为即使在Java中,您也经常分配数组)。如果您的最终目标是C++而不是C,那么您可能更喜欢少关注C字符串,确保理解基础知识,而只使用STL中的C++字符串。
发布于 2010-01-16 03:01:30
char
的返回类型应该是char*
而不是strToLower(或者根本不返回任何内容,因为它不会重新分配字符串)
发布于 2010-01-16 03:05:13
gets
!您正在引入一个缓冲区溢出漏洞。使用fgets(..., stdin)
。strToLower
中,您返回的是char
而不是char
-array。要么按照自动生成的建议返回char*
,要么直接返回void
,因为您无论如何都要修改输入。因此,只需编写 strToLower(cString1);
strToLower(cString2);
strcasecmp
(Linux和Mac)或stricmp
(Windows)。https://stackoverflow.com/questions/2074009
复制相似问题