繁体   English   中英

c中字符串和字符数组的长度差异?

[英]Difference in length between string and character array in c?

我是 C 的初学者。

我正在从用户那里获取一个字符串。 然后我将字符串的字母一个一个地存储到一个字符数组中。

代码编译得很好。

但是,当我对它们都执行 strlen function 时,结果不匹配。

if 字符串的长度,例如是 9。

那么字符数组的长度就变成了11。

据我了解, C 中的字符串有一个终止 null 字节。 因此,如果有的话,字符串的 strlen 不应该比由同一字符串组成的字符数组长吗? 是什么造成了差异?

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>


int main ( int argc, string argv[])

{   
 string plaintext = get_string("Enter plaintext:  ");
    
    printf ("length of plaintext is : %lu", strlen(plaintext));
    
printf("\n");

    
    char newstring [(strlen(plaintext))] ; 
    
    for (int i = 0, m = strlen (plaintext); i < m ; i++)
    {
        newstring[i] = plaintext[i];
        
        printf("%c  ", plaintext[i]);
        
        printf("\n");
        
    }
    
printf("length of newstring is : %lu", strlen(newstring));

printf("\n");

printf("%s", newstring);

printf ("\n");

}

谢谢。

字符串是包含 0 值终止符的字符值序列。 字符串"hello"表示为序列{'h', 'e', 'l', 'l', 'o', 0} C 没有真正的字符串类型 - CS50 和类似库提供的string typedef 是char *类型的别名,它不是字符串 由于衰减规则,大多数时候当我们处理字符串时,我们处理的是char *类型的表达式,但这些表达式本身并不是字符串。

字符串存储在字符类型的 arrays 中( char用于 ASCII、EBCDIC、UTF-8 等,或wchar_t用于“宽”编码)。 要存储 N 个字符的字符串,数组必须至少有N+1 个元素宽以说明终止符。 您的代码中的问题是您没有正确终止newstring ,因此strlen越过了它的末尾并继续计数,直到它看到一个 0 值字节。 您必须将newstring定义为

char newstring[ strlen( plaintext ) + 1 ];

在您的循环中,您必须从 0 迭代到m+1以将字符串终止符从plaintext复制到newstring 或者,您可以只使用strcpy

strlen为您提供字符串中最多但不包括终止符的字符数 - strlen( "hello" )将返回 5,但存储"hello"的数组必须至少有 6 个元素宽。 对于像 UTF-8 这样的可变长度编码,该计算变得有点复杂,其中单个字符可能需要多个字节来存储。 我没有处理 C 中扩展的 UTF-8 字符的经验,所以除了需要注意之外,我不会多说。

要注意的另一件事是 C 中的 arrays 在您写入它们时不会自动增长或收缩 - 数组的大小在其整个生命周期中是固定的,因此如果您定义一个数组来存储 10 个字符并且您尝试写入 100 个字符对它来说,那些额外的 90 个字符将被写入数组后面的 memory,这可能会导致数据损坏、运行时错误或其他问题。 C 不对数组访问进行边界检查,因此您需要确保不会溢出缓冲区(这适用于所有数组类型,而不仅仅是字符数组)。

了解 C 没有字符串非常重要。

该语言中没有类型string

C 认为是“字符串”的内容实际上始终是char类型的 arrays,预计以空值结尾,这意味着数组中的某处会有一个 '\0' 字符。

所有对字符串进行操作的函数,例如“strlen”、“strcpy”和“strcmp”,都依赖这个 null 字符来知道何时停止扫描数组。

原因是 C arrays 不包含有关其大小的信息。

因此,如果您没有 null 字符,则任何str function 都将运行,直到它找到一个或尝试访问 memory 您的程序不允许访问。

这就是为什么其中一些函数被认为是不安全的——它们可能导致未定义的行为并允许漏洞利用。

另一件重要的事情是 C 不会初始化局部变量,因此在您的代码中newstring将具有不可预测的值。

这意味着除非您在其中明确放置一个 null 字符,否则它不会有一个!

char arrays 有一个终止字符“\0”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM