**已关闭。**此问题需要debugging details。目前不接受回答。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答问题。
17天前关闭
Improve this question的
我正在更新一个旧程序和函数CleanStr(),它应该删除字符串开头和结尾的所有制表符和空格。问题是当我在结尾调用strcpy()时,它崩溃了,试图修改提供的参数C字符串。问题不是提供的字符串的null终止,这在其他地方检查过,它总是有效的。
代码如下:
bool IsEmptyChar(char tchar)
{
if (tchar == 0x09 || tchar == 0x0D || tchar == 0x0A || tchar == ' ')
return true;
return false;
}
char* CleanStr(char* tstr)
{
int len = strlen(tstr);
if (len <= 0)
return tstr;
char tempstr[MAX_ST_SIZE];
memset(tempstr, NULL, MAX_ST_SIZE);
unsigned int pos1 = 0;
unsigned int pos2 = len;
// get starting pos
while (IsEmptyChar(tstr[pos1]) && pos1 < MAX_ST_SIZE - 1)
pos1++;
// get final pos
while ((IsEmptyChar(tstr[pos2]) || tstr[pos2] == NULL) && pos2 > 0)
pos2--;
// Parse string into limits
unsigned int a;
for (a = pos1; a < pos2 + 1; a++)
tempstr[a - pos1] = tstr[a];
strcpy(tstr, tempstr); // This line makes program crash
return tstr;
}
字符串
1条答案
按热度按时间rks48beu1#
代码中有一些小问题,通过以下更改和保护措施进行了纠正:
MAX_ST_SIZE
是为CleanStr()
中的临时缓冲区和 * main中的输入缓冲区定义的。CleanStr()
中的strcpy()
现在可以说更安全了。get final pos
while()
条件,以防止pos2
的病理条件变得小于pos1
。NULL
在2个位置使用不当(特别是在您的平台上将NULL
定义为((void *)0)
时)。NULL
在get final pos
代码块的memset()
中被替换为零(0),while()
中被替换为'\0'
。IsEmptyChar()
中的常量是根据社区评论更新的--我同意这一点。经过测试,可运行代码为here。
字符串
输出量:
型