如何将字符指针传递给函数

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() 并尝试打印字符串时,我都没有得到所需的输出。

我如何使用此功能来验证任何输入的电子邮件是否有效? 我试图找到'@'的索引并检查@之前和@之后的字符,但我不知道如何存储'@'的索引,因为它不是数组。

【问题讨论】:

在执行其他任何操作之前,您应该正确地格式化和缩进您的代码。 与帖子的问题无关,只是想指出您可能有内存泄漏。对于malloced 的每一件作品,请确保释放它。 您的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;

【讨论】:

以上是关于如何将字符指针传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将指针传递给字符串,指向子字符串的指针,并返回其他内容?

如何在函数中交换作为指针传递的 2 个字符串?

如何将智能指针传递给函数?

如何将函数指针传递给成员函数c++?

工厂:如何将临时智能指针传递给函数。 C++

如何将向量传递给函数参数(我需要指针吗?)