![](/img/trans.png)
[英]what's the difference between these 4 item:character,array,string,literal. in 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.