无法写入char* 传递的参数函数,它会崩溃[已关闭]

6mw9ycah  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(115)

**已关闭。**此问题需要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;
}

字符串

rks48beu

rks48beu1#

代码中有一些小问题,通过以下更改和保护措施进行了纠正:

  • MAX_ST_SIZE是为CleanStr()中的临时缓冲区和 * main中的输入缓冲区定义的。CleanStr()中的strcpy()现在可以说更安全了。
  • 更新get final poswhile()条件,以防止pos2的病理条件变得小于pos1
  • NULL在2个位置使用不当(特别是在您的平台上将NULL定义为((void *)0)时)。NULLget final pos代码块的memset()中被替换为零(0),while()中被替换为'\0'
  • IsEmptyChar()中的常量是根据社区评论更新的--我同意这一点。

经过测试,可运行代码为here

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h> /* bool, true, false */

#define MAX_ST_SIZE 40

bool IsEmptyChar(char tchar)
{
    /* Updated constants: Best practice */
    if (tchar == '\t' || tchar == '\r' || tchar == '\n' || 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, 0, MAX_ST_SIZE);  /* Updated */

    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] == '\0') && pos2 > pos1) /* Updated */
        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 (no longer) makes program crash

    return tstr;
}

int main()
{
char s1[MAX_ST_SIZE]={' ','\n','\t','\n','\r','H','e','l','l','o',' ','W','o','r','l','d','\n','\t','\n','\r', ' '};
char s2[MAX_ST_SIZE]={' ','\n','\t','\n','\r', '\n','\t','\n','\r', ' '};
char *res = CleanStr(s1);

    printf("Res: %s\n", res);
    
    res = CleanStr(s2);
    printf("Res: %s\n", res);
    
    return 0;
}

字符串
输出量:

Res: Hello World
Res:

相关问题