1. ホーム
  2. c

[解決済み] キャストせずに整数からポインタを作る代入

2022-02-05 12:42:58

質問

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

これは2つの警告を発生させます。

  • 代入がキャストなしで整数からポインタを作る
    • cString1 = strToLower(cString1)。
    • cString2 = strToLower(cString2)。
  • ポインタをキャストせずに整数にする
    • cStringを返します。

これらの警告について、どなたか説明してください。

解決方法は?

C言語の文字列は、Javaの文字列とは異なります。基本的には文字の配列です。

strToLowerはcharを返すので、エラーが発生します。charはC言語では整数の一種です。あなたはそれをポインタであるchar[]に代入しています。したがって、quot;整数をポインタに変換しているのです。

strToLowerはすべての変更を適切に行い、特にcharを返す必要はありません。voidかchar*を返すべきでしょう。

strToLowerの呼び出しでは、代入の必要もなく、基本的にcString1のメモリアドレスを渡しているだけです。

私の経験では、C言語の文字列は、Java/C#のバックグラウンドからC言語に戻ってきた人にとって、最も習得しにくい部分です。最終的な目標がCではなくC++であれば、Cの文字列にあまりこだわらず、基本をしっかり理解し、STLからC++の文字列を使うだけの方がいいかもしれません。