来自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;
}

这将生成两个警告。
  • 赋值使指针从整数开始而无需强制转换
  • cString1 = strToLower(cString1);
  • cString2 = strToLower(cString2);
  • return从指针进行整数转换而无需强制转换
  • return cString;

  • 有人可以解释这些警告吗?

    最佳答案

    C字符串与Java字符串完全不同。它们本质上是字符数组。

    因为strToLower返回一个字符,所以出现错误。字符是C中整数的一种形式。您将其分配给作为指针的char []。因此“将整数转换为指针”。

    您的strToLower进行了所有更改,没有理由不返回任何内容,尤其是不返回char。您应该“返回” void或一个字符*。

    在调用strToLower时,也不需要分配,实际上您只是在传递cString1的内存地址。

    以我的经验,对于从Java / C#背景回到C的任何人,C语言中的字符串都是最难学习的部分。人们可以与内存分配相处(因为即使在Java中,您也经常分配数组)。如果您最终的目标是C++而不是C,则您可能宁愿较少关注C字符串,确保您了解基本知识,而仅使用STL中的C++字符串。

    10-07 18:55