C言語における文字列の大きな穴
4325 ワード
【ピット1】
エラーコード:
修正後のコード:
2つの異なるタイプのデータは比較できないが、a[i]は1文字を表し、「C」は1文字列の宛先を表すので、「C」を「C」に変更すべきである.
【ピット2】char[]の付与エラーについて
配列をstrcpyでコピーする必要があり、文字列に直接値を割り当てることはできません.
【ピット3】2つの文字列を比較すると、
例を挙げます.
しかし、プログラムが実行されると、PerformTask()は常に呼び出されていないことがわかります.
解决方法:1.Cでは、この文字列の比較方式は大きな詐欺性と殺傷力を持っており、プログラムのコンパイルも通過できるが、実際に比較された条件は常に成立しないため、条件が成立した後に実行された操作はいつも完成できない.
2 . このようなエラーがC言語で発生しないように、自分でテストプログラムをコンパイルするときはWallオプションを開くべきです.そうすると、コンパイルするときにエラーメッセージが表示されます.
ヒントは、正しい文字列処理を使用する必要があります.
3 . サンプルコード:
実行結果:
問題が解決する.
[Error] ISO C++ forbids comparison between pointer and integer [-fpermiss
エラーコード:
if(a[i]=="G"&&b[i]!="C")
return false;
修正後のコード:
if(a[i]=='G'&&b[i]!='C')
return false;
2つの異なるタイプのデータは比較できないが、a[i]は1文字を表し、「C」は1文字列の宛先を表すので、「C」を「C」に変更すべきである.
【ピット2】char[]の付与エラーについて
error: invalid array assignment
配列をstrcpyでコピーする必要があり、文字列に直接値を割り当てることはできません.
【ピット3】2つの文字列を比較すると、
warning:comparison with string literal results in unspecified behaviour
が表示されます.例を挙げます.
char* pstr = "enable";
if (pstr == "enable") PerformTask();
しかし、プログラムが実行されると、PerformTask()は常に呼び出されていないことがわかります.
解决方法:1.Cでは、この文字列の比較方式は大きな詐欺性と殺傷力を持っており、プログラムのコンパイルも通過できるが、実際に比較された条件は常に成立しないため、条件が成立した後に実行された操作はいつも完成できない.
2 . このようなエラーがC言語で発生しないように、自分でテストプログラムをコンパイルするときはWallオプションを開くべきです.そうすると、コンパイルするときにエラーメッセージが表示されます.
warning: comparison with string literal results in unspecified behavior [-Waddress]
ヒントは、正しい文字列処理を使用する必要があります.
3 . サンプルコード:
#include
#include
int main() {
printf("
========================================================================
");
char str1[] = "1/6";
char* delim1 = "/";
char* seq_no = NULL;
char* total_no = NULL;
seq_no = strtok(str1, delim1);
printf("seq_no is: %s
", seq_no);
total_no = strtok(NULL, delim1);
printf("total_no is: %s
", total_no);
// if (seq_no == "1") {
if (!strcmp(seq_no, "1")) {
printf("This is seq number %s
", 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$
問題が解決する.