如何将字符指针传递给函数
Posted
技术标签:
【中文标题】如何将字符指针传递给函数【英文标题】:How to pass a character pointer to a function 【发布时间】:2017-02-16 04:30:23 【问题描述】:我正在尝试解决一个问题,我必须获取一个字符指针并存储一封电子邮件,然后将该指针传递给一个函数,以便我可以验证输入字符串中是否有任何特殊字符。 这是代码
#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() 并尝试打印字符串时,我都没有得到所需的输出。
我如何使用此功能来验证任何输入的电子邮件是否有效? 我试图找到'@'的索引并检查@之前和@之后的字符,但我不知道如何存储'@'的索引,因为它不是数组。
【问题讨论】:
在执行其他任何操作之前,您应该正确地格式化和缩进您的代码。 与帖子的问题无关,只是想指出您可能有内存泄漏。对于malloc
ed 的每一件作品,请确保释放它。
您的scanf()
应该是scanf("%99s",email)
,因为字段宽度不包括终止空值。另外,为什么要一次打印一个以空字符结尾的字符串?
另外,你可能希望你的循环在找到特殊字符时结束,并且只在循环结束后打印“不存在”而不找到它......照原样,你会打印一个字符串中每个字符的消息(在修复丢失字符串开头的其他问题之后)。
【参考方案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;
【讨论】:
你能解释一下你为什么使用这个吗// 重置 z 指向 z = em 的位置; 在while
循环之前,z
指向字符串的第一个字符。循环退出后,z
指向字符串的最后一个字符。通过使用z = em;
,我们使z
再次指向字符串的第一个字符。【参考方案2】:
不要在那里使用 *?++。你永远无法确定它是像 *?, ?++ 还是 * ?, (*?)++。
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;
【讨论】:
以上是关于如何将字符指针传递给函数的主要内容,如果未能解决你的问题,请参考以下文章