据我所知,UTF-8 是一种变长编码,即一个字符可以表示为 1 个字节、2 个字节、3 个字节或 4 个字节。
例如,Unicode 字符 U+00A9 = 10101001 以 UTF-8 编码为
110 00010 10 101001,即0xC2 0xA9
第一个字节中的前缀 110 表示该字符用两个字节存储(因为我在前缀 110 中数了两个直到零)。
以下字节中的前缀以 10 开头
一个 4 字节的 UTF-8 编码看起来像
11110 xxx 10 xxxxxx 10 xxxxxx 10 xxxxxx
前缀 11110(四个一和零)表示四个字节,依此类推。
现在我的问题:
为什么在以下字节中使用前缀 10?这样的前缀有什么好处?如果在以下字节中没有 10 前缀,我可以多使用 3*2=6 位,如果我写:
1111 0000 xxxxxxxx xxxxxxxx xxxxxxxx
我有:
struct date
{
int day;
int month;
int year;
};
struct person {
char name[25];
struct date birthday;
};
struct date d = { 1, 1, 1990 };
Run Code Online (Sandbox Code Playgroud)
初始化用
struct person p1 = { "John Doe", { 1, 1, 1990 }};
Run Code Online (Sandbox Code Playgroud)
作品.
但是,如果我尝试
struct person p2 = { "Jane Doe", d};
Run Code Online (Sandbox Code Playgroud)
我得到一个错误:
"日期无法转换为int".
怎么了?d是结构日期,第二个参数也应该是结构日期.所以它应该工作.感谢致敬
我尝试理解scanf和输入缓冲区之间的关系.我使用带有以下格式字符串的scanf:
int z1,z2;
scanf("%d %d", &z1,&z2);
Run Code Online (Sandbox Code Playgroud)
并尝试理解为什么我输入尽可能多的空格(Enter,Blanks,Tabs)后输入54之类的数字并按Enter键.
据我所知,我按下的每个键都放在输入缓冲区中,直到按Enter键.
因此,如果我键入54并按Enter键,则输入缓冲区包含3个元素,两个数字和换行符.所以我的缓冲区看起来像[5] [4] [\n]
现在从左到右评估scanf/formatstring.所以第一个%d与54匹配,54存储在z1中.
由于格式字符串中的空格,因按下第一个输入而导致的换行符(\n)被"消耗".
因此,在评估第一个%d和空格(\n)之后,缓冲区再次为空.
现在scanf尝试评估格式字符串中的第二个(和最后一个)%d.因为缓冲区现在是空的,所以scanf等待进一步的用户输入(用户输入=从我的案例键盘中的stdin读取).
所以缓冲状态/动作序列是
缓冲区空 - >调用scanf - > scanf块供用户输入 - >用户输入为:54输入 - >缓冲区包含:[5] [4] [\n] - >评估第一个%d - >缓冲区包含[\n] - >评估空白 - >缓冲区空 - >用于用户输入的scanf块(因为评估了第二个和最后一个%d) - > ...
我明白这是对的吗?(对不起,英语不是我的母语)
问候
我尝试从 MSSQL Server 2016 数据库中的现有表中读取数据。如果我验证(hbm2ddl.auto --> 验证),我会收到异常“架构验证:缺少表”。
我将生成的 Hibernate SQL 代码(如果我从验证切换到更新)与我可以在 MSSQL Server 本身中生成的 SQL 代码进行了比较。它看起来是相同的:
-- generated SQL from Hibernate
create table Artikel (
Artnr int not null,
Artgruppe CHAR(5),
Bezeichnung VARCHAR(30) not null,
EPreis money,
primary key (Artnr)
)
-- generated SQL from MSSQL Server 2016
CREATE TABLE [dbo].[Artikel](
[Artnr] [int] NOT NULL,
[Bezeichnung] [varchar](30) NOT NULL,
[EPreis] [money] NULL,
[Artgruppe] [char](5) NULL,
PRIMARY KEY CLUSTERED
(
[Artnr] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = …Run Code Online (Sandbox Code Playgroud) 我有点困惑.我有以下功能:
int comp(char s1[], char s2[]) {
return s1 == s2;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这只比较了char数组s1和char数组中第一个元素的地址s2.
但奇怪的是,如果我比较(在Visual Studio中)两个相等的char数组
comp("test","test");
Run Code Online (Sandbox Code Playgroud)
我得到1(真)而不是0(假).但是地址不应该不同,因此结果应该始终为0吗?
据我所知
int func(int arr[5]) {
printf("Test");
}
Run Code Online (Sandbox Code Playgroud)
方括号中的数组大小(例如 5)没有任何意义,因为 arr 只是指向数组第一个元素的指针,即它与
int func(int *arr) {
printf("Test");
}
Run Code Online (Sandbox Code Playgroud)
或者
int func(int arr[]) {
printf("Test");
}
Run Code Online (Sandbox Code Playgroud)
但是,如果数字本身没有任何意义,为什么可以在方括号中写入像 5 这样的数字呢?
我有一个batchscript mybatch,我尝试将第一个用户参数存储在一个名为FILE的变量中
set FILE = %1
if defined FILE (
echo defined
echo do something with %1
) else (
echo not defined %1
)
Run Code Online (Sandbox Code Playgroud)
如果我通过mybatch test1执行我的批处理,我总是没有定义test1.为什么没有定义变量FILE?
如何以子类使模板类型为“修复”的方式使用模板基类。
例如,我有一个模板基类:
template <class A, int size> class BaseClass{
private:
A *elem;
public:
A()
{
elem = new A[size];
}
};
Run Code Online (Sandbox Code Playgroud)
我可以
BaseClass<int, 5> mybase;
Run Code Online (Sandbox Code Playgroud)
现在,我想制作一个仅具有参数size且类型应该为int的子类,即该子类应将A基类中的类型替换为固定类型(例如int)
像这样:
SubClass<5> mysubclass;
// type should be fixed to int, e.g. mysubclass can do the same like mybase
Run Code Online (Sandbox Code Playgroud)
问候
c ×4
arrays ×2
batch-file ×1
c++ ×1
character ×1
cmd ×1
comparison ×1
encoding ×1
hibernate ×1
inheritance ×1
scanf ×1
size ×1
sql ×1
sql-server ×1
struct ×1
templates ×1
unicode ×1
utf-8 ×1
variables ×1