我的代码在这里:
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()函数)。
答案 0 :(得分:4)
来自C标准:
标题
<ctype.h>
声明了几个对字符分类和映射有用的函数。在所有情况下,参数都是一个int,其值应表示为unsigned char或者等于宏EOF的值。如果参数具有任何其他值,则行为未定义。
强调我的。
MSDN's description of toupper()
hints at this as well:
为了让toupper得到预期的结果,__ isascii和isupper必须都返回非零值。
如果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上,你就会溢出它。
希望它有所帮助。