【问题标题】:char pwdToTest[4] = "ABCD"; how can I detect the end of the string in C?字符 pwdToTest[4] = "ABCD";如何检测 C 中字符串的结尾?
【发布时间】:2017-03-27 17:27:52
【问题描述】:

我试图掌握 char 数组来执行“字符串”操作,但我无法弄清楚这种行为。我基本上是在尝试实现 strlen 函数。

本质上,问题在于如果我分配:

char pwdToTest[4] = "ABCD";

然后我尝试遍历寻找'\0'的每个字符,我刚刚意识到最后没有'\0',而是在第五个内存位置(它可能是一个'\0\ 或以前测试中的其他内容),所以我无法检测到“字符串”的结尾。

这解决了这个问题:

char pwdToTest[5] = "ABCD\0";

创建“字符串”并分配值以便它可以在 strlen 或我自己的 strlen 实现中使用的正确方法是什么。

我的实现供参考:

int calLenCharArr(char *charArray)
{
    int i = 0;            
    while (charArray[i] != '\0')
    {
        printf("%c      %i\n",charArray[i],charArray[i]);
        i++;
    }        
    printf("lenth: %i", i);

    return i;
} 

【问题讨论】:

  • 不,char pwdToTest[5] = "ABCD"; — 为您添加了 '\0'
  • 字符串文字的末尾已经有一个隐含的\0。但是你不要复制它,因为你将数组大小限制为4。不要指定大小,让它从文字中推导出来
  • 此外:char pwdToTest[] = "ABCD"; - 为您设置大小(包括\0)。
  • 感谢您的及时答复!!我现在明白了,即使 C 试图为我添加 \0,如果我限制数组的空间,它也无法做到:-)

标签: c arrays string initialization


【解决方案1】:

C strings 是以 null 结尾的字符数组。除非 char 数组以 null 结尾,否则根据定义,您不能调用 字符串

引用C11,第 7.1.1 章

string 是一个连续的字符序列,以第一个 null 结尾,包括第一个 null 特点。 [...]

所以,当你说

 char pwdToTest[4] = "ABCD";

你没有任何地方可以存储空终止符。

最好的方法是保留数组的大小并用所需的字符串字面量对其进行初始化

char pwdToTest[ ] = "ABCD";

自动分配空间,包括终止空字符。

相关,第 §6.7.9 章,(强调我的

字符类型的数组可以由字符串字面量或 UTF-8 字符串初始化 字面量,可选地用大括号括起来。字符串文字的连续字节(包括 如果有空间或数组大小未知,则终止空字符)初始化 数组的元素。

现在,pwdToTest 有资格被称为 字符串,并且所有与字符串相关的函数都可以使用它。

【讨论】:

  • 感谢详细解答!!真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多