1. ホーム
  2. Debugging

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$





問題解決