c言語における文字列のエラーになりやすい点
2022-02-10 17:15:19
質問です。
ソースコードはC++のコードから変換されているため、Cスタイルの文字列比較については、C++でCスタイルの文字列を比較する方法と同じ方法がそのまま使用されます
char* pstr = "enable";
if (pstr == "enable") {
PerformTask();
}
しかし、プログラムを実行すると、PerformTask()が一度も呼び出されないことがわかります。
回避策
1. C++では、問題で使用した文字列比較のアプローチは動作します。
C言語では、プログラムがコンパイルされて通過しても、実際には比較される条件が常に成立しないため、条件が成立したときに行う演算が常に失敗してしまうため、文字列比較は非常に欺瞞的で致命的なものです。
2. C言語でこの種のエラーを防ぐには、テストプログラムを自分でWallオプションをオンにしてコンパイルし、エラーでコンパイルされるようにする必要があります。
u1204@u1204-zhw:~/wrk/tmp/cpp_src/c_exer$ gcc -Wall -std=gnu99 -o test_strtok test_strtok.c
test_strtok.c: In function 'main':
test_strtok.c:49:16: warning: comparison with string literal results in unspecified behavior [-Waddress]
u1204@u1204-zhw:~/wrk/tmp/cpp_src/c_exer$
ヒントは、正しい文字列処理を使用する必要があります。
3. コード例です。
#include <stdio.h>
#include <string.h>
int main() {
printf("\n========================================================================\n");
char str1[] = "1/6";
char* delim1 = "/";
char* seq_no = NULL;
char* total_no = NULL;
seq_no = strtok(str1, delim1);
printf("seq_no is: %s\n", seq_no);
total_no = strtok(NULL, delim1);
printf("total_no is: %s\n", total_no);
// if (seq_no == "1") {
if (!strcmp(seq_no, "1")) {
printf("This is seq number %s\n", seq_no);
}
return 0;
}
結果を実行します。
u1204@u1204-zhw:~/wrk/tmp/cpp_src/c_exer$ . /test_strtok
========================================================================
seq_no is: 1
total_no is: 6
This is seq number 1
u1204@u1204-zhw:~/wrk/tmp/cpp_src/c_exer$
関連
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例