计算字符 S 的字节数

Counting Bytes Of Char S

本文关键字:字节数 字符 计算      更新时间:2023-10-16

我有作业,它是:

在下面编写函数的代码,这个函数应该计算 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!真的我不知道我应该怎么做这个问题,如果我只能在常量字符中存储一个字符,所以结果应该总是相同的。这个问题到底在寻找什么?

功课意味着你应该编写一个行为如下的函数:

int main() {
    char s[] = {'a','b','c',''};
    unsigned s_length = len(s);
    // s_length will be equal to 3 ('a','b','c', not counting '')
}

我认为不太可能有人会在这里为你做作业。

如果要求您这样做,则假定您的类已经涵盖了函数参数、指针和数组。所以我想你在问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',''};
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:

const char k[] = { 1,2,3,0};
const char* s = &k[0];
cout << len(s) << 'n'; // prints 3
char m[] = { 'a', 'b', 'c', 'd', '', 'e', 'f'};
cout << len(m) << 'n'; // prints 4
char const *j = "Hello"; // automatically inserts a '' at the end
cout << len(j) << 'n'; // prints 5

在 C(以及扩展C++(中,字符串可以表示为以空字符结尾的字符序列。 因此,字符串"abc"将表示为

'a', 'b', 'c', ''

这意味着,您可以通过计算每个字符来获取 C 字符串的长度,直到遇到 null。 因此,如果您有一个以 null 结尾的const char*字符串,您可以通过循环字符串并递增计数器变量直到找到"\0"字符来找出该字符串的长度。

这意味着你有一个字符串,比如hello world每个字符串都以结尾。这意味着它看起来像这样:hello world

现在越过字符数组(char* s(,直到找到

更新:
实际上只是一个价值0x00字符。 用于告诉可视化这是意思,而不是字符串中0的数字。

例:
0abc -> 以数字 0 开头并以 0x0 结尾的字符串。

编辑

char * 表示变量的类型 s 。它是指向字符数组的指针。 const表示此字符数组是只读的,无法更改。

你的意思是"计算字符数直到找到'\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

我不会:P写你的作业,但让我给你一些提示:它被称为"指针算术"。所以,指针就像它的名字一样:一个指向记忆"细胞"的指针。如您所知,内存中的所有变量都存储在"单元格"中,您可以通过地址引用。C 字符串存储在内存中的连续单元格中,因此例如"abc"看起来像这样(当您定义带引号的字符串文字时,编译器会添加"\0"(:

+----+----+----+----+
|'a' |'b' |'c' |''|
+----+----+----+----+
  ^
  s

您还将获得第一个字符的地址。现在,要获取"b"的地址,您可以像这样简单地将 1 添加到 s:(s + 1) .要获取 s 指向的单元格中的实际内容,您应该使用 * 运算符: *s = 'a'*(s + 1) = 'b'.这称为指针算法。

备注:在这种情况下,向指针添加一个将移动到下一个单元格,因为char的长度为一个字节。如果您定义了一个指向更大结构的指针(例如 4 个字节long int(,添加一个指针将移动到内存中下一个结构开始的位置(如果long int它将移动 +4 字节(。

现在这应该足以帮助您完成硬件。

好的,我已经找到了答案,只需检查我是否属实:

#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"设置为常量字符* s;因此,对于常量字符*变量,我应该使用带有符号("(的"Hello"之类的字符串。这是真的吗?