我刚刚开始学习指针,所以我想我会分享我想要做的事情。在一个字符数组中(让我们称之为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;。
答案 0 :(得分:1)
你走在正确的轨道上。但是,有一些事情是不对的。
sizeof(c_ptr)
的使用不对。由于巧合,它适合你的情况。
sizeof(c_ptr)
等于sizeof(char*)
。它不等于调用函数的数组大小。
在函数末尾缺少return
语句 - 在c
中找不到c_ptr
的情况。
break;
之后无需return;
。
此外,您可以稍微简化一下这个功能。
这是一个更新版本:
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总是一个字符,而不是一个数字,所以如果不是这样,则需要强制转换。