提交 822692eb 编写于 作者: W wizardforcel

2019-08-15 22:05:53

上级 449b8cf5
......@@ -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>
......
......@@ -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 编程中使用字符串以及如何使用预定义的字符串处理函数。
我们将看到如何比较两个字符串,连接字符串,将一个字符串复制到另一个字符串&amp;执行各种字符串操作操作。我们可以使用“string.h”头文件的预定义函数执行此类操作。要使用这些字符串函数,必须在 C 程序中包含 string.h 文件。
我们将看到如何比较两个字符串,连接字符串,将一个字符串复制到另一个字符串&amp;执行各种字符串操作操作。我们可以使用`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 终结器&amp;空字符。
**什么是 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&lt; string2 OR string1 是 string2** 的子字符串,然后它会产生负值。如果 string1&gt; 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 的长度&gt;然后它只是将 str2 的前 n 个字符复制到 str1 中。
**情况 2:**如果 str2 的长度&lt;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
......@@ -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`数据类型的变量来存储返回的值。
结构看起来像 -
......
......@@ -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&amp;的值调用。 NUM2。实际上 var1 和 var2 实际上是交换的(不是 num1 和 num2)。在按值调用时,实际参数只是复制到形式参数中。
\ No newline at end of file
原因相同 - 函数由`num1``num2`的值调用。实际上`var1``var2`实际上是交换的(不是`num1``num2`)。在按值调用时,实际参数只是复制到形式参数中。
\ No newline at end of file
......@@ -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
......
......@@ -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.
先完成此消息的编辑!
想要评论请 注册