我正在尝试解决一个问题,我必须使用字符指针并存储电子邮件,然后将该指针传递给函数,以便我可以验证输入字符串中是否有任何特殊字符。 这是代码
#include <stdio.h>
#include <stdlib.h>
void verify(char** em)
{
char *z = *em;
while(*z)
{
printf("%c", *z++);
}
while(*z != '\n')
{
if(*z == 'a')
{
printf("present");
*z++;
}
else
{
printf("not present");
}
}
}
int main()
{
int count = 0;
char *email = malloc(sizeof(char) * 100);
printf("enter the email id\n");
scanf("%100s", email);
while(*email)
{
printf("%c", *email++);
}
verify(&email);
return 0;
}
每当我将字符指针传递给我的函数verify()并尝试打印字符串时,我都无法获得所需的输出。
如何使用此功能验证输入的电子邮件是否有效? 我想找到&#39; @&#39;的指数并在@之前和之后检查字符,但我不知道如何存储&#39; @&#39;的索引。因为它不是一个数组。
答案 0 :(得分:1)
问题1
行
while(*email)
printf("%c",*email++);
移动email
,使其指向循环结束时字符串的结尾。您需要跟踪email
的原始值。
char* it = email;
while(*it)
printf("%c",*it++);
问题2
您没有释放调用malloc
时收到的内存。
问题3
行
while(*z)
printf("%c",*z++);
移动z
,使其指向循环结束时字符串的结尾。您需要将其重置为指向字符串的开头。
问题4
然后,你有
if(*z=='a')
{
printf("present");
*z++;
}
这是一个问题。除非z
为*z
,否则'a'
不会移动。
修正了verify
:
// You don't need the input to be of type char**
void verify(char* em)
{
char *z = em;
while(*z)
printf("%c",*z++);
// Reset where z points
z = em;
while(*z!='\n')
{
if(*z=='a')
{
printf("present");
}
else printf("not present");
// Move z regardless of the value of *z
++z;
}
}
修正了main
:
int main()
{
int count=0;
char *email=malloc(sizeof(char)*100);
printf("enter the email id\n");
scanf("%100s",email);
char* it = email;
while(*it)
printf("%c",*it++);
// Just use email, not &email
verify(email);
// Deallocate memory
free(email);
return 0;
}
答案 1 :(得分:0)
不要在那里使用*?++。你不能确定它是否像*?,?++或*?,(*?)++。
void verify(char* em){
char *z = em;
while(*z)
printf("%c",*(z++));//do you realy need to print the email more than once?
//in the verify() and the main()
// Reset where z points
z = em;
while(*z!='\n'&&*z!='\0')
{
if(*z=='a')
{
printf("present");
}
else printf("not present");
// Move z regardless of the value of *z
++z;
}
}
int main()
{
int count=0;
char *email=malloc(sizeof(char)*100);
printf("enter the email id\n");
scanf("%100s",email);
char* it = email;
while(*it)
printf("%c",*(it++));
// Just use email, not &email
verify(email);
// Deallocate memory
free(email);
return 0;
}