计算Char S的字节数

时间:2012-03-15 13:01:05

标签: c++

我有一份作业,它是:

  

写下面的函数代码,这个函数应该计算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中存储一个字符,那么结果总是一样的。这个问题究竟在寻找什么?

6 个答案:

答案 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')
}

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

如果要求您执行此操作,可能您的类已涵盖函数参数,指针和数组。所以我猜你问的是constconst 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“字符串。这是真的吗?

相关问题