首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >赋值使指针从整数开始,而不进行强制转换

赋值使指针从整数开始,而不进行强制转换
EN

Stack Overflow用户
提问于 2010-01-16 02:59:07
回答 8查看 234.4K关注 0票数 30

来自Java背景的我正在学习C,但我发现那些模糊的编译器错误消息越来越令人沮丧。下面是我的代码:

代码语言:javascript
复制
/*
 * 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;

有人能解释一下这些警告吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-01-16 03:01:15

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

因为strToLower返回了一个字符,所以你得到了这个错误。字符是C中整数的一种形式。你将它赋值给一个char[],它是一个指针。因此,“将整数转换为指针”。

你的strToLower做了所有的修改,它没有理由返回任何东西,尤其是不返回字符。

在调用strToLower时,也不需要赋值,本质上只是传递cString1的内存地址。

根据我的经验,对于任何从Java/ C #背景回到C的人来说,C中的字符串是最难学习的部分。人们可以适应内存分配(因为即使在Java中,您也经常分配数组)。如果您的最终目标是C++而不是C,那么您可能更喜欢少关注C字符串,确保理解基础知识,而只使用STL中的C++字符串。

票数 41
EN

Stack Overflow用户

发布于 2010-01-16 03:01:30

char的返回类型应该是char*而不是strToLower(或者根本不返回任何内容,因为它不会重新分配字符串)

票数 6
EN

Stack Overflow用户

发布于 2010-01-16 03:05:13

  • 1)不要使用gets!您正在引入一个缓冲区溢出漏洞。使用fgets(..., stdin)
  • 2)在strToLower中,您返回的是char而不是char-array。要么按照自动生成的建议返回char*,要么直接返回void,因为您无论如何都要修改输入。因此,只需编写

代码语言:javascript
复制
 strToLower(cString1);
 strToLower(cString2);

  • 3)要比较不区分大小写的字符串,可以使用strcasecmp (Linux和Mac)或stricmp (Windows)。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2074009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档