segmentation fault
void filter(char *p)
{
char t[80]; // 错误写法:char *p;
int i = 0, j = 0, k = 0;
for (i; i < strlen(p); i++)
if (isalpha(p[i]))
{
t[j] = p[i];
j++;
}
for(k; k < j; k++)
t[k] = toupper(t[k]);
strcpy(p, t); // 采用错误写法时,此处会发生segmentation fault
*(p + k) = '\0';
}
对于现在的流行语言C#,JAVA等,都是不允许使用未赋值变量的。
而定义一个指针,不说明指向,是很危险的,相当于未赋值的变量。
方法便是用数组来解决。
另一种情况如下
bool palin(char *p)
{
char t[80]; // 错误写法:char *t;
strcpy(t, p);
char *head, *tail;
head = t;
tail = t + strlen(t) - 1;
while(head < tail)
{
while(!isalpha(*head))
head++;
while(!isalpha(*tail))
tail--;
*head = toupper(*head); // 此处出现segmentation fault
*tail = toupper(*tail);
if (*head == *tail)
{
head++;
tail--;
}
else return false;
}
if (head >= tail)
return true;
else return false;
}
归根结底,用数组能避免空间分配和变量未赋值的问题。