我想知道为什么第36行导致断言失败

时间:2017-01-26 06:17:35

标签: c

根据错误消息,行“strStripped [k] = RemSpecial [i];”导致调试断言失败。 表达式:c> = - 1&& c< = 255

我不知道发生了什么事。

我试图自己解决这个问题。但是,我只是一个初学者。它超出了我的范围。

提前感谢您的意见。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

char OnlyAlphabet(char RemSpecial[]);

int main()
{
char str[50];

printf("Insert the sentence to check the Palindrome: ");
scanf_s("$s", str);

printf("%s\n", OnlyAlphabet(str));

return 0;

}

char OnlyAlphabet(char RemSpecial[])
{
char strStripped[50];
int i;
int j = 0;
int k = 0;
for (i = 0; i < strlen(RemSpecial); i++)
{
    if (isalnum(RemSpecial[i]))
    {
        ***strStripped[k] = RemSpecial[i];***
        k++;
    }
}

strStripped[k] = '\0';

return strStripped;
}

1 个答案:

答案 0 :(得分:0)

他们的代码存在一些问题:

  • 这一行:

    scanf_s("$s", str);
    

    需要改为:

    scanf_s("%49s", str);
    

    scanf()需要格式说明符的%部分,而不是$。最好使用%49s而不是简单的%s,这可以保护str不受缓冲区溢出的影响。我还建议使用scanf(),因为它更容易使用。

  • 您的函数char OnlyAlphabet(char RemSpecial[])仅返回char。您希望它为char *,它将返回指向已修改字符串strStripped的指针。

    但是,这意味着您无法在堆栈上分配此数组,如:

    char strStripped[50];
    

    因为它会在函数返回时展开,因此调用此函数是不安全的。它只返回在堆栈上分配的局部变量的地址,当函数返回时,它将离开图片。

    您需要在堆上分配指针,以便在整个程序中共享strStripped。您可以malloc执行此操作。

      

    malloc()在堆上分配请求的内存,并返回一个void*指针。

    关于你的程序,这可以这样实现:

    char *strStripped = malloc(strlen(RemSpecial)+1);
    

    分配内存块,足以容纳RemSpecial和空字节字符\0

    注意: malloc()可以返回NULL,需要在继续之前进行检查。您还需要在程序结束时以安全的方式free此内存。

  • 您也不需要strlen()作为循环字符串的保护。您可以直接循环,直到找到\0字符。

    你的警卫可以是这样的:

    RemSpecial[i] != '\0'
    

您的程序将被修改为:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define STRSIZE 50

char *OnlyAlphabet(char RemSpecial[]);

int main(void) {
    char str[STRSIZE];
    char *result;

    printf("Insert the sentence to check the Palindrome: ");
    scanf("%49s", str);

    result = OnlyAlphabet(str);

    printf("%s\n", result);

    free(result);
    result = NULL;

    return 0;
}

char *OnlyAlphabet(char RemSpecial[]) {
    char *strStripped;
    int i, k = 0;

    strStripped = malloc(strlen(RemSpecial)+1);
    if (strStripped == NULL) {
        printf("Cannot allocate string\n");
        exit(EXIT_FAILURE);
    }

    for (i = 0; RemSpecial[i] != '\0'; i++) {
        if (isalnum(RemSpecial[i])) {
            strStripped[k] = RemSpecial[i];
            k++;
        }
    }

    strStripped[k] = '\0';

    return strStripped;
}