有没有办法可以使用函数返回数组元素的内存位置?

时间:2017-03-06 06:38:08

标签: c++

我刚刚开始学习指针,所以我想我会分享我想要做的事情。在一个字符数组中(让我们称之为c并且它等于" Hello"),我试图返回某个元素的内存位置。说出' l'的位置记忆。这就是我到目前为止所拥有的:

include 'contact/config.php';

require_once 'class.user.php';
$user_home = new USER();

if(!$user_home->is_logged_in())
{
    $user_home->redirect('index.php');
}

$stmt = $user_home->runQuery("SELECT * FROM tbl_client_info WHERE UCODE=:uid");
$stmt->execute(array(":uid"=>$_SESSION['userSession']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);

error_reporting (E_ALL ^ E_NOTICE);

$post = (!empty($_POST)) ? true : false;

if($post)
{

$name = $row['firstname'];
$email = $row['billingemail'];
$subject = "myDraadloze Package Contact Card";
$message = stripslashes($_POST['Please contact user regarding example']);


$error = '';



if(!$error)
{
$mail = mail(WEBMASTER_EMAIL, $subject, $message, 
     "From: ".$name." <".$email.">\r\n"
    ."Reply-To: ".$email."\r\n"
    ."X-Mailer: PHP/" . phpversion());


if($mail)
{
echo 'OK';
}

}


}
?>

使用该功能后,输出&#34; llo&#34;。

3 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。但是,有一些事情是不对的。

  1. sizeof(c_ptr)的使用不对。由于巧合,它适合你的情况。

    sizeof(c_ptr)等于sizeof(char*)。它不等于调用函数的数组大小。

  2. 在函数末尾缺少return语句 - 在c中找不到c_ptr的情况。

  3. break;之后无需return;

  4. 此外,您可以稍微简化一下这个功能。

    这是一个更新版本:

    char* str_char(char* c_ptr, char c)
    {
       for (char* cp = c_ptr; *cp != '\0'; ++cp )
       {
          if (*cp == c)
          {
             return cp;
          }
       }
       return nullptr;
    }
    

答案 1 :(得分:0)

早期的答案涵盖了错误,所以我只回答实际问题......

函数 返回数组元素的位置。

<<运算符将每个char*视为指向以零结尾的字符串的指针,输出str_char的结果与输出c完全相同;它打印该位置后的每个字符,直到遇到零。

如果要输出位置本身的值,则需要将其转换为其他类型:

cout << static_cast<void*>(str_char(c, 'l')) << endl;

因为<<void*的重载,它会输出地址本身。

答案 2 :(得分:0)

R Sahu给你答案,这是你的功能的略微修改版本。这是合法代码,但这基本上是一个C代码,除了使用nullptr。返回nullptr是非正规的,如果将返回nupllptr,那么&lt;&lt;运营商会做什么?这是未定义的行为。 通常会同意模式让迭代器(指针)指向行尾(在终止零处),以避免因返回nullptr而导致崩溃。

char* str_char(char* c_ptr, char c)
{
   char* cp = c_ptr; 

   for (; *cp != '\0'; ++cp )
   {
      if (*cp == c)
      {
         return cp;
      }
   }
   return cp; 
   // if cp was declared inside scope , we can't retirn it's value
}

通常你不需要编写自己的字符串函数.bth C库和C ++已经覆盖了它们。 C ++有一套抽象的算法函数,在你的情况下是一个strchr,find或find_if是谨慎的:

#include <algorithm>
#include <iostream>

using std::cout;

int main()
{
    char *c = "Hello";


    cout << std::strchr(c, 'l') << '\n';

    // with pointer to null-terminated string, strlen searches 
    // for zero char and returns the count of characters before it
    cout << std::find(c, c + strlen(c), 'l') << '\n';


    // with  declared array we can use std:begin and std::end
    char carr[] = "Hello"; 

    cout << std::find(std::begin(carr),std::end(carr) , 'l') << '\n';


    // with pointer to null-terminated string a lambda expression 
    // can be used to stop at 0 as well as at first key
    const char key = 'l';
    cout << std::find_if(c, c + strlen(c),[=](const char& item)
    {
        return (item ==  key) || (item ==  '\0');
    }) << '\n';


    return 0;

}

std :: vector或:: array或其他容器也可以与这些模板一起使用。 <algorithms>标题可以节省您调试定制函数以进行搜索,迭代等所需的大量时间。

P.S。 cout和cin以特殊方式处理char和char * .. char *总是指向字符串,char总是一个字符,而不是一个数字,所以如果不是这样,则需要强制转换。