我有一份作业,它是:
写下面的函数代码,这个函数应该计算s里面的字节数,直到它不是'\ 0'。
功能:
unsigned len(const char* s);
真的我不知道这个功课是什么意思,有人可以写这个功课的代码吗? 还有更多人可以解释一下“Const char * s”是什么意思吗?如果你能用一些例子来解释那将是完美的。
以下是我正在尝试执行的代码:
unsigned len(const char* s)
{
int count=0;; int i=0;
while (*(s+i)!=0)
{
count++;
i++;
}
return count;
}
但是在主要功能中,我不知道应该写什么,顺便说一下,我已经写了这个:
const char k='m';
const char* s=&k;
cout << len(s) << endl;
结果总是4!我真的不知道该怎么办这个问题,如果我只能在const char中存储一个字符,那么结果总是一样的。这个问题究竟在寻找什么?
答案 0 :(得分:6)
家庭作业意味着你应该写一个行为如下的函数:
int main() {
char s[] = {'a','b','c','\0'};
unsigned s_length = len(s);
// s_length will be equal to 3 ('a','b','c', not counting '\0')
}
我认为这里不太可能有人为你做作业。
如果要求您执行此操作,可能您的类已涵盖函数参数,指针和数组。所以我猜你问的是const
。 const char* s
表示s指向const char
,这意味着您无权修改char
。也就是说,以下是非法的:
unsigned len(const char *s) {
*s = 'a'; // error, modifying a const char.
}
以下是有关编写函数指针的基本知识。首先,在这种情况下,指针指向数组中的元素。那就是:
char A[] = {'a','b','c','\0'};
char const *s = &A[0]; // s = the address of A[0];
指针指向引用,char
。要获得char
你取消引用指针:
char c = *s;
// c is now equal to A[0]
因为s
指向数组的元素,所以可以添加和删除指针以访问数组的其他元素:
const char *t = s+1; // t points to the element after the one s points to.
char d = *t; // d equals A[1] (because s points to A[0])
您也可以使用数组索引运算符:
char c = s[0]; // c == A[0]
c = s[1]; // c == A[1]
c = s[2]; // c == A[2]
你会用什么顺序查看数组的每个元素,增加索引?
您提出的解决方案看起来应该可以正常工作。你得到4的结果的原因只是巧合。你可能会得到任何结果。您调用该函数的方式存在问题:
const char k='m';
const char* s=&k;
cout << len(s) << endl;
是保证最后没有'\0'
。你需要创建一个数组,其中一个元素是0:
const char k[] = { 1,2,3,0};
const char* s = &k[0];
cout << len(s) << '\n'; // prints 3
char m[] = { 'a', 'b', 'c', 'd', '\0', 'e', 'f'};
cout << len(m) << '\n'; // prints 4
char const *j = "Hello"; // automatically inserts a '\0' at the end
cout << len(j) << '\n'; // prints 5
答案 1 :(得分:2)
这意味着您有一个类似hello world
的字符串。每个字符串都以\0
结尾。这意味着它看起来像这样:hello world\0
现在跳过char数组(char* s
),直到找到\0
。
更新:
\0
实际上只是一个值0x00
的单个字符。 \
用于告知可视化,而不是字符串中的数字0
。
例:
0abc\0
- &gt;字符串以数字0
开头,以0x0
结尾。
char *
表示变量s
的类型。它是一个指向字符数组的指针。 const
表示此字符数组是只读的,无法更改。
答案 2 :(得分:2)
在C(和扩展名C ++)中,字符串可以表示为由空字符终止的字符序列。因此,字符串“abc”将表示为
'a', 'b', 'c', '\0'
这意味着,您可以通过计算每个字符来获取C字符串的长度,直到遇到null。因此,如果您有一个空的终止const char*
字符串,您可以通过循环字符串并递增计数器变量直到找到'\ 0'字符来找出该字符串的长度。
答案 3 :(得分:1)
你的意思是“在找到'\ 0'之前计算字符数”? 如果是这样,你可以像这样实现它:
for each character
if it is not 0
increment x (where x is variable holding number of characters found)
otherwise
stop looking
return x
答案 4 :(得分:1)
我也不打算写你的作业:P,但是让我给你一些提示:它被称为“指针算术”。因此,指针就像名称所说的那样:指向内存“单元格”的指针。如您所知,内存中的所有变量都存储在“单元格”中,您可以通过地址引用。 AC字符串存储在内存中的连续单元格中,因此例如“abc”看起来像(编译器在使用引号定义字符串文字时添加'\ 0'):
+----+----+----+----+
|'a' |'b' |'c' |'\0'|
+----+----+----+----+
^
s
并且您还获得了第一个字符的地址。现在,要获取'b'的地址,您可以简单地添加一个像这样:(s + 1)
。要获得实际位于s指向的单元格中的,您应该使用*运算符:
*s = 'a'
或*(s + 1) = 'b'
。这称为指针算法。
注意:在这种情况下,向指针添加一个移位到下一个单元格,因为char是一个字节长。如果您定义一个指向更大结构的指针(long int
,例如4个字节),则添加一个将移动到内存中您的下一个结构将开始的位置(如果long int
它将移动+4个字节)。
现在应该有足够的帮助来完成你的hw。
答案 5 :(得分:1)
好的,我找到了答案,检查一下我是否属实:
#include <iostream>
using namespace std;
unsigned len(const char*);
int main()
{
const char* s = "Hello";
cout << len(s) << endl;
return 0;
}
unsigned len(const char* s)
{
int count=0;; int i=0;
while (*(s+i)!=0)
{
count++;
i++;
}
return count;
}
所以它显示我已将“Hello”设置为const char * s;因此对于const char *变量,我应该使用带有符号(“)的”Hello“字符串。这是真的吗?