Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
beginnersbook-zh
提交
822692eb
B
beginnersbook-zh
项目概览
OpenDocCN
/
beginnersbook-zh
大约 1 年 前同步成功
通知
0
Star
107
Fork
30
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
B
beginnersbook-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
822692eb
编写于
8月 15, 2019
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2019-08-15 22:05:53
上级
449b8cf5
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
72 addition
and
68 deletion
+72
-68
docs/c/22.md
docs/c/22.md
+2
-2
docs/c/24.md
docs/c/24.md
+46
-42
docs/c/26.md
docs/c/26.md
+6
-6
docs/c/27.md
docs/c/27.md
+2
-2
docs/c/28.md
docs/c/28.md
+2
-2
docs/c/30.md
docs/c/30.md
+14
-14
未找到文件。
docs/c/22.md
浏览文件 @
822692eb
...
...
@@ -73,9 +73,9 @@ int main()
### 如何将整个数组作为参数传递给函数?
在上面的例子中,我们在 C 中使用
[
for
循环逐个传递每个数组元素的地址。但是,您也可以将整个数组传递给这样的函数:
](
https://beginnersbook.com/2014/01/c-for-loop/
)
在上面的例子中,我们在 C 中使用
[
`for`
循环逐个传递每个数组元素的地址。但是,您也可以将整个数组传递给这样的函数:
](
https://beginnersbook.com/2014/01/c-for-loop/
)
> 注意:数组名称本身是该数组的第一个元素的地址。例如,如果数组名称为
arr,则可以说 **arr** 等同于**& arr [0]**
。
> 注意:数组名称本身是该数组的第一个元素的地址。例如,如果数组名称为
`arr`,则可以说`arr`等同于`&arr[0]`
。
```
c
#include <stdio.h>
...
...
docs/c/24.md
浏览文件 @
822692eb
...
...
@@ -2,9 +2,9 @@
> 原文: [https://beginnersbook.com/2014/01/c-strings-string-functions/](https://beginnersbook.com/2014/01/c-strings-string-functions/)
**
String
是一个字符数组**
。在本指南中,我们将学习如何声明字符串,如何在 C 编程中使用字符串以及如何使用预定义的字符串处理函数。
**
字符串
是一个字符数组**
。在本指南中,我们将学习如何声明字符串,如何在 C 编程中使用字符串以及如何使用预定义的字符串处理函数。
我们将看到如何比较两个字符串,连接字符串,将一个字符串复制到另一个字符串
&
执行各种字符串操作操作。我们可以使用
“string.h”头文件的预定义函数执行此类操作。要使用这些字符串函数,必须在 C 程序中包含 string.h
文件。
我们将看到如何比较两个字符串,连接字符串,将一个字符串复制到另一个字符串
&
执行各种字符串操作操作。我们可以使用
`string.h`
头文件的预定义函数执行此类操作。要使用这些字符串函数,必须在 C 程序中包含
`string.h`
文件。
## 字符串声明
...
...
@@ -21,10 +21,10 @@ char address[]={'T', 'E', 'X', 'A', 'S', '\0'};
char
address
[]
=
"TEXAS"
;
```
在上面的声明中,NULL 字符(
\
0
)将自动插入字符串的末尾。
在上面的声明中,NULL 字符(
`\0`
)将自动插入字符串的末尾。
**什么是 NULL
Char“\ 0”
?**
`'\0'`
表示字符串的结尾。它也被称为
String 终结器
&
空字符。
**什么是 NULL
字符`\0`
?**
`'\0'`
表示字符串的结尾。它也被称为
字符串结尾或
空字符。
## C 编程中的字符串 I/O.
...
...
@@ -63,7 +63,7 @@ Enter your Nick name:Negan
Negan
```
**注意:**
%s
格式说明符用于字符串输入/输出
**注意:**
`%s`
格式说明符用于字符串输入/输出
### 使用`gets()`和`puts()`函数在 C 中读取和编写字符串
...
...
@@ -99,10 +99,10 @@ int main()
size_t
strlen
(
const
char
*
str
)
```
**
size_t
**
表示无符号短
它返回字符串的长度而不包括结束字符
**(终止字符
'\ 0'
)**
。
**
`size_t`
**
表示无符号短
它返回字符串的长度而不包括结束字符
**(终止字符
`\0`
)**
。
**
strlen
的例子:**
**
`strlen`
的例子:**
```
c
#include <stdio.h>
...
...
@@ -121,11 +121,11 @@ Output:
Length
of
string
str1
:
13
```
**
strlen vs sizeof
**
strlen 返回存储在数组中的字符串的长度,但 sizeof
返回分配给数组的总分配大小。因此,如果我再次考虑上述示例,则以下语句将返回以下值。
**
`strlen` vs `sizeof`
**
`strlen`
返回存储在数组中的字符串的长度,但
`sizeof`
返回分配给数组的总分配大小。因此,如果我再次考虑上述示例,则以下语句将返回以下值。
`strlen(str1)`
返回值 13
\.
`sizeof(str1)`
将返回值 20,因为数组大小为 20(请参阅
main
函数中的第一个语句)。
`strlen(str1)`
返回值 13
。
`sizeof(str1)`
将返回值 20,因为数组大小为 20(请参阅
`main`
函数中的第一个语句)。
### C 字符串函数 - `strnlen`
...
...
@@ -135,10 +135,10 @@ Syntax:
size_t
strnlen
(
const
char
*
str
,
size_t
maxlen
)
```
size_t
表示无符号短
如果字符串小于为
maxlen 指定的值(最大长度),则返回字符串的长度,否则返回 maxlen
值。
`size_t`
表示无符号短
如果字符串小于为
`maxlen`
指定的值(最大长度),则返回字符串的长度,否则返回
`maxlen`
值。
**
strnlen
的例子:**
**
`strnlen`
的例子:**
```
c
#include <stdio.h>
...
...
@@ -153,10 +153,10 @@ int main()
```
输出:
当
maxlen 为 30:13 时字符串 str1
的长度
当
maxlen 为 10:10 时字符串 str1
的长度
当
`maxlen`
为
`30:13`
时字符串
`str1`
的长度
当
`maxlen`
为
`10:10`
时字符串
`str1`
的长度
您是否注意到第二个
printf 语句的输出,即使字符串长度为 13,它只返回 10,因为 maxlen
为 10。
您是否注意到第二个
`printf`
语句的输出,即使字符串长度为 13,它只返回 10,因为
`maxlen`
为 10。
### C 字符串函数 - `strcmp`
...
...
@@ -166,10 +166,10 @@ int strcmp(const char *str1, const char *str2)
它比较两个字符串并返回一个整数值。如果两个字符串相同(相等),则此函数将返回 0,否则它可能会根据比较返回负值或正值。
**如果
string1< string2 OR string1 是 string2**
的子字符串,然后它会产生负值。如果 string1
>
string2
然后它将返回正值。
**如果
string1 == string2
**
,那么当你将此函数用于比较字符串时,你会得到 0(零)。
**如果
`string1<string2`或者`string1`是`string2`**
的子字符串,然后它会产生负值。如果
`string1>string2`
然后它将返回正值。
**如果
`string1 == string2`
**
,那么当你将此函数用于比较字符串时,你会得到 0(零)。
**
strcmp
示例:**
**
`strcmp`
示例:**
```
c
#include <stdio.h>
...
...
@@ -201,10 +201,10 @@ string 1 and 2 are different
int
strncmp
(
const
char
*
str1
,
const
char
*
str2
,
size_t
n
)
```
size_t
用于未分配的短
它比较字符串直到
n 个字符,或者换句话说,它比较两个字符串的前 n
个字符。
`size_t`
用于未分配的短
它比较字符串直到
`n`
个字符,或者换句话说,它比较两个字符串的前
`n`
个字符。
**
strncmp
示例:**
**
`strncmp`
示例:**
```
c
#include <stdio.h>
...
...
@@ -239,7 +239,7 @@ char *strcat(char *str1, char *str2)
它连接两个字符串并返回连接的字符串。
**
strcat
示例:**
**
`strcat`
示例:**
```
c
#include <stdio.h>
...
...
@@ -266,9 +266,9 @@ Output string after concatenation: HelloWorld
char
*
strncat
(
char
*
str1
,
char
*
str2
,
int
n
)
```
它将
str2 的 n 个字符连接到字符串 str1。终结符 char('
\
0'
)将始终附加在连接字符串的末尾。
它将
`str2`
的
`n`
个字符连接到字符串
`str1`
。终结符(
`\0`
)将始终附加在连接字符串的末尾。
**
strncat
示例:**
**
`strncat`
示例:**
```
c
#include <stdio.h>
...
...
@@ -295,9 +295,9 @@ Concatenation using strncat: HelloWor
char
*
strcpy
(
char
*
str1
,
char
*
str2
)
```
它将字符串
str2 复制到字符串 str1 中,包括结束字符(终结符 char'
\
0'
)。
它将字符串
`str2`
复制到字符串
`str1`
中,包括结束字符(终结符
`\0`
)。
**
strcpy
示例:**
**
`strcpy`
示例:**
```
c
#include <stdio.h>
...
...
@@ -321,12 +321,16 @@ String s1 is: string 2: I’m gonna copied into s1
### C 字符串函数 - `strncpy`
char
* strncpy(char *
str1,char
*
str2,size_t n)
size_t 是未分配的 short,n 是数字。
**情况 1:**
如果 str2 的长度
>
然后它只是将 str2 的前 n 个字符复制到 str1 中。
**情况 2:**
如果 str2 的长度
<
1。然后它将 str2 的所有字符复制到 str1 中,并附加几个终结符字符('
\
0')以累积 str1 的长度使其成为 n。
**strncpy 的例子:**
```
c
char
*
strncpy
(
char
*
str1
,
char
*
str2
,
size_t
n
)
```
`size_t`
是未分配的
`short`
,
`n`
是数字。
**情况 1:**
如果
`str2`
的长度
`>n`
然后它只是将
`str2`
的前
`n`
个字符复制到
`str1`
中。
**情况 2:**
如果
`str2`
的长度
`<n`
。然后它将
`str2`
的所有字符复制到
`str1`
中,并附加几个终结符字符(
`\0`
)以累积
`str1`
的长度使其成为
`n`
。
**`strncpy`的例子:**
```
c
#include <stdio.h>
...
...
@@ -354,9 +358,9 @@ String s1 is: string 2: I’m
char
*
strchr
(
char
*
str
,
int
ch
)
```
它在字符串
str 中搜索字符 ch(您可能想知道在上面的定义中我已经将 ch 的数据类型赋予了 int,不要担心我没有犯任何错误它应该只是 int。事情是当我们给任何在使用 strchr
时,它会在内部转换为整数以便更好地搜索。
它在字符串
`str`
中搜索字符
`ch`
(您可能想知道在上面的定义中我已经将
`ch`
的数据类型赋予了
`int`
,不要担心我没有犯任何错误它应该只是
`int`
。事情是当我们给任何在使用
`strchr`
时,它会在内部转换为整数以便更好地搜索。
**
strchr
的例子:**
**
`strchr`
的例子:**
```
c
#include <stdio.h>
...
...
@@ -381,7 +385,7 @@ f function strchr
char
*
strrchr
(
char
*
str
,
int
ch
)
```
它类似于
strchr 函数,唯一的区别是它以相反的顺序搜索字符串,现在你已经理解为什么我们在 strrchr 中有额外的 r
,是的你猜对了它,它只是反向的。
它类似于
`strchr`
函数,唯一的区别是它以相反的顺序搜索字符串,现在你已经理解为什么我们在
`strrchr`
中有额外的
`r`
,是的你猜对了它,它只是反向的。
现在让我们采用相同的上述示例:
...
...
@@ -402,7 +406,7 @@ int main()
function
strchr
```
**为什么输出与
strchr 不同?**
这是因为它从字符串的末尾开始搜索并在函数中找到第一个'f'而不是'of'
。
**为什么输出与
`strchr`不同?**
这是因为它从字符串的末尾开始搜索并在函数中找到第一个
`'f'`
而不是
`'of'`
。
### C 字符串函数 - `strstr`
...
...
@@ -410,9 +414,9 @@ function strchr
char
*
strstr
(
char
*
str
,
char
*
srch_term
)
```
它类似于
strchr,除了它搜索字符串 srch_term 而不是单个 char
。
它类似于
`strchr`
,除了它搜索字符串
`srch_term`
而不是单个字符
。
**
strstr
示例:**
**
`strstr`
示例:**
```
c
#include <stdio.h>
...
...
@@ -431,4 +435,4 @@ int main()
Output
string
is
:
BeginnersBook
.
COM
```
您也可以使用此函数代替 strchr,因为您也可以使用单个字符代替 search_term 字符串。
\ No newline at end of file
您也可以使用此函数代替
`strchr`
,因为您也可以使用单个字符代替
`search_term`
字符串。
\ No newline at end of file
docs/c/26.md
浏览文件 @
822692eb
...
...
@@ -11,7 +11,7 @@ b)创建一个执行该任务的函数,并在每次需要执行该任务时
### 函数类型
1)
**预定义的标准库函数**
- 如
`puts()`
,
`gets()`
,
`printf()`
,
`scanf()`
等 - 这些函数已经在头文件中有定义(
.h
文件如
`stdio.h`
),所以我们只要在需要使用它们时调用它们。
1)
**预定义的标准库函数**
- 如
`puts()`
,
`gets()`
,
`printf()`
,
`scanf()`
等 - 这些函数已经在头文件中有定义(
`.h`
文件如
`stdio.h`
),所以我们只要在需要使用它们时调用它们。
2)
**用户定义函数 -**
我们在程序中创建的函数称为用户定义函数。
...
...
@@ -34,9 +34,9 @@ return_type function_name (argument list)
}
```
**
return_type:**
返回类型可以是任何数据类型,如 int,double,char,void,short
等。一旦你完成下面的例子,不要担心你会更好地理解这些术语。
**
`return_type`:**
返回类型可以是任何数据类型,如
`int`
,
`double`
,
`char`
,
`void`
,
`short`
等。一旦你完成下面的例子,不要担心你会更好地理解这些术语。
**
function_name
:**
它可以是任何东西,但建议为函数设置一个有意义的名称,这样只要看到它的名字就可以很容易地理解函数的用途。
**
`function_name`
:**
它可以是任何东西,但建议为函数设置一个有意义的名称,这样只要看到它的名字就可以很容易地理解函数的用途。
**参数列表:**
参数列表包含变量名称及其数据类型。这些参数是函数的一种输入。例如 - 用于添加两个整数变量的函数将具有两个整数参数。
...
...
@@ -46,7 +46,7 @@ return_type function_name (argument list)
让我们举一个例子 - 假设你想创建一个函数来添加两个整数变量。
**让我们分解问题,以便它易于理解 -**
函数将添加两个数字,因此它应该有一些有意义的名称,如
sum,addition
等。例如,让我们取名为这个函数。
函数将添加两个数字,因此它应该有一些有意义的名称,如
`sum`
,
`addition`
等。例如,让我们取名为这个函数。
```
c
return_type
addition
(
argument
list
)
...
...
@@ -148,14 +148,14 @@ How are you?
**有关 C 中函数的注意事项:**
1)C 程序中的
`main()`
也是一个函数。
2)每个 C 程序必须至少有一个函数,即
main()
。
2)每个 C 程序必须至少有一个函数,即
`main()`
。
3)函数数量没有限制; C 程序可以具有任意数量的函数。
4)一个函数可以调用自身,它被称为“
**递归**
”。我已经为它写了一份单独的指南。
**C 函数必须记住的术语**
**返回类型:**
返回值的数据类型。它也可以是无效的,在这种情况下,函数不返回任何值。
注意:例如,如果函数返回类型是
**
char,**
那么函数应该返回 char 类型的值,并且在调用此函数时 main()函数应该有一个 char
数据类型的变量来存储返回的值。
注意:例如,如果函数返回类型是
**
`char`,**
那么函数应该返回
`char`
类型的值,并且在调用此函数时
`main()`
函数应该有一个
`char`
数据类型的变量来存储返回的值。
结构看起来像 -
...
...
docs/c/27.md
浏览文件 @
822692eb
...
...
@@ -28,7 +28,7 @@ int main(
}
```
在上面的例子中,变量
a 和 b 是形式参数(或形式参数)。变量 var1 和 var2 是实际参数(或实际参数)。实际参数也可以是值。像 sum(10,20)
一样,这里 10 和 20 是实际参数。
在上面的例子中,变量
`a`
和
`b`
是形式参数(或形式参数)。变量
`var1`
和
`var2`
是实际参数(或实际参数)。实际参数也可以是值。像
`sum(10,20)`
一样,这里 10 和 20 是实际参数。
在本指南中,我们将按值讨论
**函数调用。如果您想通过引用方法读取调用,请参考本指南:[函数调用参考](https://beginnersbook.com/2014/01/c-function-call-by-reference-example/)。**
...
...
@@ -107,4 +107,4 @@ After swapping: 35, 45
```
**为什么变量在交换后仍保持不变?**
原因相同 - 函数由 num1
&
的值调用。 NUM2。实际上 var1 和 var2 实际上是交换的(不是 num1 和 num2)。在按值调用时,实际参数只是复制到形式参数中。
\ No newline at end of file
原因相同 - 函数由
`num1`
和
`num2`
的值调用。实际上
`var1`
和
`var2`
实际上是交换的(不是
`num1`
和
`num2`
)。在按值调用时,实际参数只是复制到形式参数中。
\ No newline at end of file
docs/c/28.md
浏览文件 @
822692eb
...
...
@@ -11,7 +11,7 @@
int
sum
(
int
a
,
int
b
);
```
a 和 b
参数是形式参数。
`a`
和
`b`
参数是形式参数。
我们正在调用这样的函数:
...
...
@@ -65,7 +65,7 @@ Value of num is: 21
## 示例 2:按引用调用函数 - 交换数字
这里我们使用引用调用来交换数字。正如您所看到的,在调用
swapnum()函数后,变量的值已经更改,因为交换发生在变量 num1 和 num2
的地址上。
这里我们使用引用调用来交换数字。正如您所看到的,在调用
`swapnum()`
函数后,变量的值已经更改,因为交换发生在变量
`num1`
和
`num2`
的地址上。
```
c
#include
...
...
docs/c/30.md
浏览文件 @
822692eb
...
...
@@ -6,11 +6,11 @@
让我们说我们需要存储学生的数据,如学生姓名,年龄,地址,身份证等。这样做的一种方法是为每个属性创建一个不同的变量,但是当你需要存储多个学生的数据时,那么例如,您需要为每个学生再次创建这几个变量。以这种方式存储数据非常令人头疼。
我们可以通过使用结构轻松解决这个问题。我们可以创建一个具有
name,id,address 和 age
成员的结构,然后我们可以为每个学生创建这个结构的变量。这可能听起来令人困惑,不要担心我们会在示例的帮助下理解这一点。
我们可以通过使用结构轻松解决这个问题。我们可以创建一个具有
`name`
,
`id`
,
`address`
和
`age`
成员的结构,然后我们可以为每个学生创建这个结构的变量。这可能听起来令人困惑,不要担心我们会在示例的帮助下理解这一点。
## 如何在 C 编程中创建一个结构
我们使用
**
struct**
关键字在 C 中创建
**结构。 struct 关键字是**
结构化数据类型的简短形式。
****
我们使用
**
`struct`**
关键字在 C 中创建结构。
`struct`
关键字是结构化数据类型的简短形式。
```
c
struct
struct_name
{
...
...
@@ -21,9 +21,9 @@ struct struct_name {
};
```
这里
struct_name 可以是你选择的任何东西。成员数据类型可以相同或不同。一旦我们声明了结构,我们就可以使用 struct name 作为数据类型,如 int,float
等。
这里
`struct_name`
可以是你选择的任何东西。成员数据类型可以相同或不同。一旦我们声明了结构,我们就可以使用
`struct name`
作为数据类型,如
`int`
,
`float`
等。
> 首先,我们将看到创建
struct 变量,访问 struct
成员等的语法,然后我们将看到一个完整的示例。
> 首先,我们将看到创建
`struct`变量,访问`struct`
成员等的语法,然后我们将看到一个完整的示例。
### 如何声明结构的变量?
...
...
@@ -53,7 +53,7 @@ var_name.member2_name;
### 如何为结构成员复制?
有三种方法可以做到这一点。
1)使用
Dot(。
)运算符
1)使用
点(
`.`
)运算符
```
c
var_name
.
memeber_name
=
value
;
...
...
@@ -108,12 +108,12 @@ Student Age is: 30
## C:中的嵌套结构:另一个结构中的结构
您可以在另一个结构中使用结构,这是相当可能的。正如我上面所解释的,一旦你声明了一个结构,
**
struct struct_name
**
就像一个新的数据类型,所以你可以把它包含在另一个结构中,就像其他数据成员的数据类型一样。听起来很混乱?别担心。以下示例将清除您的疑问。
您可以在另一个结构中使用结构,这是相当可能的。正如我上面所解释的,一旦你声明了一个结构,
**
`struct struct_name`
**
就像一个新的数据类型,所以你可以把它包含在另一个结构中,就像其他数据成员的数据类型一样。听起来很混乱?别担心。以下示例将清除您的疑问。
### C 编程中嵌套结构的例子
假设我们有两个这样的结构:
**结构 1:
stu_address
**
**结构 1:
`stu_address`
**
```
c
struct
stu_address
...
...
@@ -125,7 +125,7 @@ struct stu_address
}
```
**结构 2:
stu_data
**
**结构 2:
`stu_data`
**
```
c
struct
stu_data
...
...
@@ -154,16 +154,16 @@ mydata.stuAddress.state = "UP"; //Nested struct assignment
#### 如何访问嵌套结构成员?
使用
“。”
运算符链。
使用
`.`
运算符链。
假设你想从嵌套结构中单独显示城市 -
```
c
printf
(
"%s"
,
mydata
.
stuAddress
.
city
);
```
## 在结构中使用
typedef
## 在结构中使用
`typedef`
typedef 使代码简短并提高了可读性。在上面的讨论中,我们已经看到,每次使用结构时我们都必须使用冗长的语法,这会使代码混乱,冗长,复杂且可读性降低。这个问题的简单解决方案是使用 typedef。它就像 struct
的别名。
`typedef`
使代码简短并提高了可读性。在上面的讨论中,我们已经看到,每次使用结构时我们都必须使用冗长的语法,这会使代码混乱,冗长,复杂且可读性降低。这个问题的简单解决方案是使用
`typedef`
。它就像
`struct`
的别名。
**没有 typedef 的代码**
...
...
@@ -179,7 +179,7 @@ struct home_address var;
var
.
town
=
"Agra"
;
```
**使用
typedef
的代码**
**使用
`typedef`
的代码**
```
c
typedef
struct
home_address
{
...
...
@@ -194,11 +194,11 @@ addr var1;
var
.
town
=
"Agra"
;
```
每次需要声明
struct 变量时,不必使用 struct home_address,只需使用 addr,即我们定义的 typedef
。
每次需要声明
`struct`
变量时,不必使用
`struct home_address`
,只需使用
`addr`
,即我们定义的
`typedef`
。
## 指定初始值设定项以设置结构成员的值
我们已经学会了两种设置
struct 成员值的方法,还有另一种方法可以使用指定的初始化器来完成相同的操作。当我们只分配结构的少数成员时,这很有用。在以下示例中,结构变量 s2
只有一个成员赋值。
我们已经学会了两种设置
`struct`
成员值的方法,还有另一种方法可以使用指定的初始化器来完成相同的操作。当我们只分配结构的少数成员时,这很有用。在以下示例中,结构变量
`s2`
只有一个成员赋值。
```
c
#include <stdio.h>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录