根据错误消息,行“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;
}
答案 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;
}