-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,其值应表示为无符号字符或应等于宏 EOF 的值。如果参数有任何其他值,则行为是 undefined

强调我的。

MSDNtoupper()对此的提示描述:

为了让 toupper 给出预期的结果,__isascii 和 isupper 必须都返回非零值。

isascii()

如果 c 是 ASCII 字符(在 0x00 – 0x7F 范围内),__isascii 返回一个非零值。

于 2013-04-08T10:49:18.687 回答
3

循环的退出测试是错误的。 strlen(tab)将始终返回 false 或 true(取决于tab)。这意味着您继续写入zwr超出其分配的长度。这样做的影响是不确定的,但它最终崩溃也就不足为奇了。

您可以通过将循环更改为来解决此问题

for(a;a<strlen(tab);a++)
//    ^^

另一个可能的错误原因zwr是硬编码为 30 个字节。这显然不足以满足所有可能的值,tab因此您可以将代码更改为

size_t len = strlen(zwr)+1;
zwr=malloc(len);
for(;a<len;a++)
于 2013-04-08T10:42:25.623 回答
2

这将永远运行:

for(a;strlen(tab);a++)

我想你的意思是:

for(a;a < strlen(tab);a++)

或者更好(因为strlen是 O(n)):

for(;tab[a];a++)
于 2013-04-08T10:42:56.667 回答
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。如果您将 1 添加到现有值 255 - 您会溢出它。

希望能帮助到你。

于 2013-04-08T10:52:46.133 回答