-3

私のコードはここにあります:

char* kropecka(char* tab)
{
    int a=0,b=0;
    char* zwr;
    zwr=(char*)malloc(30*sizeof(char));

    for(a;strlen(tab);a++)
    {
        if(tab[a]!='.')
        {
            if(isupper(tab[a]))
                zwr[b]=tolower(tab[a]);
            if(islower(tab[a]))
                zwr[b]=toupper(tab[a]);
            b++;
        }
    }
    zwr[b]='\0';
    return zwr;
}

エラー、警告などはありません。しかし、彼に文字列を与えると、プログラムがクラッシュしました。

--------------------------- Microsoft Visual C++ デバッグ ライブラリ ------------------ --------- デバッグ アサーションに失敗しました!

プログラム: ...s\Visual Studio 2010\Projects\C_homework\Debug\C_homework.exe ファイル: f:\dd\vctools\crt_bld\self_x86\crt\src\isctype.c 行: 56

式: (符号なし)(c + 1) <= 256

プログラムがどのようにアサーション エラーを引き起こすかについては、アサートに関する Visual C++ のドキュメントを参照してください。

(アプリケーションをデバッグするには、[再試行] を押します)

--------------------------- 中止 再試行 無視

コンパイラ: Visual Studio 2010 含まれるライブラリ: stdio.h、string.h、ctype.h、stdlib.h ( main() の system() 関数用)。

4

4 に答える 4

4

C標準から:

ヘッダー<ctype.h>は、文字の分類とマッピングに役立ついくつかの関数を宣言します。すべての場合において、引数は int であり、その値は unsigned char として表現可能であるか、マクロ EOF の値と等しくなければなりません。引数が他の値を持つ場合、動作は undefinedです。

鉱山を強調します。

MSDN の説明もtoupper()これに関するヒントです。

toupper が期待どおりの結果を返すためには、__isascii と isupper の両方がゼロ以外を返す必要があります。

isascii() :

__isascii は、c が ASCII 文字 (0x00 ~ 0x7F の範囲) の場合、0 以外の値を返します。

于 2013-04-08T10:49:18.687 に答える
0

コールスタックを確認してください - うまくいけば、問題の根本にたどり着くでしょう。

int __cdecl _chvalidator(
    int c,
    int mask
    )
 {
    _ASSERTE((unsigned)(c + 1) <= 256);
    return ( _pctype[c] & mask);
 }

このメソッドは、文字値の境界をチェックするメソッドのように見えます...

isctype.c -

/***
* __chvalidator
*
* Purpose:
*      This function is called by character testing functions in debug
*      versions. This function test for validation of c as character.
*      For improvement in performance, it is not used in non-debug
*      version.  It is available in the static single-thread non-debug
*      build, though, just in case C code that includes ctype.h is compiled
*      /D_DEBUG /ML.
*
*******************************************************************************/

簡単に言えば、変数でオーバーフローしているようです。つまり、Unsigned Char は最大値 255 を取ることができます。既存の値 255 に 1 を追加すると、オーバーフローします。

それが役に立てば幸い。

于 2013-04-08T10:52:46.133 に答える