tolower()和toupper()不起作用

时间:2013-04-08 10:40:35

标签: c string uppercase lowercase

我的代码在这里:

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 ++调试库   --------------------------- Debug Assertion Failed!

     

程序:... 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 ++文档。

     

(按“重试”调试应用程序)

     

---------------------------中止重试忽略

Compilator:Visual Studio 2010 包含libary:stdio.h,string.h,ctype.h,stdlib.h(对于main()中的system()函数)。

4 个答案:

答案 0 :(得分:4)

来自C标准:

  

标题<ctype.h>声明了几个对字符分类和映射有用的函数。在所有情况下,参数都是一个int,其值应表示为unsigned char或者等于宏EOF的值。如果参数具有任何其他值,则行为未定义

强调我的。

MSDN's description of toupper() hints at this as well

  

为了让toupper得到预期的结果,__ isascii和isupper必须都返回非零值。

isascii()

  如果c是ASCII字符(在0x00 - 0x7F范围内),则

__ isascii返回非零值。

答案 1 :(得分: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++)

答案 2 :(得分:2)

这将永远运行:

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

我认为你的意思是:

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

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

for(;tab[a];a++)

答案 3 :(得分:0)

检查callstack - 希望它会把你带到问题的根源。

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上,你就会溢出它。

希望它有所帮助。