5-字符串
1. 字符串 String
a. 定义
C 中的字符串是一个以NULL字符\0
结尾的字符数组。
字符串声明可以通过多种方式进行,每种方式都有各自考虑的因素。
例如:
char str_name[str_len] = "string";
这将创建一个由 str_len 个字符组成的名为 str_name 的字符串,并将其初始化为值"string"。
提供字符串文本初始化字符串时,编译器会自动将 NULL 字符 \0 添加到字符数组末尾。
因此,声明数组大小至少比预期的字符串长度长一个字符。
下面的语句创建包含 NULL 字符的字符串。如果声明不包含 char 数组大小,则将根据初始化中字符串的长度加上\0
的值来计算:
#include <stdio.h>
int main() {
char str[6] = "Hello "; //数组超过5个字符
char str1[6] = "Hello";
char str2[] = "World";
printf("%s %s;\n",str,str2); //出现了奇怪的地址解引用
printf("%s %s;\n",str1,str2);
printf("Str1 is %s, str2 is %s;\n",str1,str2);
return 0;
}
一个字符串也可以声明为一组字符,如下:
#include <stdio.h>
int main() {
char str3[6] = {'h','e','l','l','o'};
char str4[ ] = {'w','o','r','l','d','\0'}; //未声明数组长度必须以“\0”结尾
printf("Str3 is: %s, str4 is: %s", str3, str4);
return 0;
}
1. 使用这种方法,必须明确添加 NULL 字符\0
。
(否则)
字符是用单引号 ' 括起来的。
与任何数组一样,字符串的名也为一个指针。
字符串是用双引号 " 括起来的文本。
char *str = "stuff"
字符串指针的声明,如char *str = "stuff"
; 被认为是一个常量,不能改变其初始值。
<string.h>
为了安全和方便地操作字符串,你可以使用下面标准库中的字符串函数(不要忘记包括 <string.h> ):
strlen()
-获取字符串的长度
strcat()
-连接两个字符串
strcpy()
-将一个字符串复制到另一个
strlwr()
-将字符串转化为小写字母
strupr()
-将字符串转化为大写字母
strrev()
-反转字符串
strcmp()
-比较两个字符串
⚠️注意
字符串函数和字符串指针将在以后的课程中介绍。
填空,将字符串声明为 char 数组:
___ str[] = "Hello, world!";
char
2. 字符串输入
ⅰ. scanf()
程序通常是交互式的,要求用户输入。 为了从用户那里获取一行文本或其他字符串,C 提供了scanf()
、gets()
和fgets()
函数。
你可以使用scanf()
根据格式指定符来读取输入的字符串。例如:
#include <stdio.h>
int main() {
char first_name[25];
int age;
printf("Enter your first name and age:\n");
scanf("%s %d", first_name, &age);
printf("\nHi, %s. Your age is %d",first_name, age);
return 0;
}
当scanf()
用于读取字符串时,不需要用&
访问变量地址,因为数组名first_name
就是一个指针。
scanf()
在读到一个空格时就停止读取输入。
ⅱ.
要读取一个有空格的字符串,请使用 gets()类 函数。它读取输入,直到到达一个换行符 \n
(按了 Enter 键)。
例如:
#include <stdio.h>
int main() {
char full_name[50];
printf("Enter your full name: ");
gets(full_name);
printf("\nHi, %s.", full_name);
return 0;
}
ⅲ. fgets()
1. 替代 gets() 的一个更安全的方法是 fgets(),它最多读取指定数量的字符。
例如:
#include <stdio.h>
int main() {
char full_name[50];
printf("Enter your full name: ");
fgets(full_name, 50, stdin);
printf("\nHi, %s", full_name);
return 0;
}
fgets()
的参数是字符串名和读取的字符数,以及一个指向你想从哪里读取字符串的指针。stdin意味着要从标准输入,也就是键盘上获取。
2. gets 和 fgets 之间的另一个区别是,换行符\n
fgets() 会存储。
3.
⚠️注意
fgets() 只从 stdin 中读取 n-1
个字符,因为必须为 \0
留出空间。
填空,使用 scanf 函数从输入中读取字符串存储到 char 数组 str 中:
___ str[20];
scanf("%s", ___ );
char
&str
3. 字符串输出
1. 字符串输出由 fputs()
、puts()
和 printf()
函数处理。
fputs() 需要字符串名和一个指向你想打印字符串的位置的指针。要打印到屏幕上,使用 stdout,指的是标准输出。
例如:
#include <stdio.h>
int main() {
char city[40];
printf("Enter your favorite city: ");
gets(city);
// Note: for safety, use
// fgets(city, 40, stdin);
fputs(city, stdout);
printf(" is a fun city.");
return 0;
}
puts() 函数仅接受一个字符串参数,也可以用来显示输出。然而,它在输出中添加了一个换行。
例如:
#include <stdio.h>
int main() {
char city[40];
printf("Enter your favorite city: ");
gets(city);
// Note: for safety, use
// fgets(city, 40, stdin);
puts(city);
return 0;
}
填空,声明字符串,并使用 fputs() 函数将其输出到屏幕:
___ name[] = "John Smith";
___ (___, stdout);
char
fputs
name
可以使用 sprintf() 函数创建格式化的字符串。这对于用其他数据类型来构建字符串很有用。
例如:
#include <stdio.h>
int main() {
char info[100];
char dept[] = "HR";
int emp = 75;
sprintf(info, "The %s dept has %d employees.", dept, emp);
printf("%s\n", info);
return 0;
}
另一个有用的函数是 sscanf(),用于扫描字符串中的值。 该函数从字符串中读取值,并将其存储在相应的变量地址中。
例如:
#include <stdio.h>
int main() {
char info[] = "Snoqualmie WA 13190";
char city[50];
int state[50];
int population;
sscanf(info,"%s %s %d", city, state, &population);
/*一一对应 ⬆1 ⬆2 ⬆3
* ⬇3 ⬇1 ⬇2 */
printf("%d peeple lives in %s %s ", population, city, state);
return 0;
}