[解決済み] キャストせずに整数からポインタを作る代入
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++の文字列を使うだけの方がいいかもしれません。
関連
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?