1.输出字符串
(1)puts
char *p = "aha c";
char str[128] = {"hello world"};puts(p);
puts(str);
puts函数会自动在输出后进行换行。
(2)printf
char *p = "aha c";
char str[128] = {"hello world"};printf("%s\n",p);
printf("%s\n",str);
printf函数在输出字符串时使用 %s 进行输出,且没有自动换行功能。
2.获取字符串
(1)scanf
char *p = "aha c";
char str[128] = {"hello world"};puts("请输入字符串:");
scanf("%s",str);
在 scanf 中使用 %s 来获取字符串。
(2)gets
gets函数的用法如下:
char *p = "aha c";
char str[128] = {"hello world"};puts("请再次输入字符串:");
gets(str);
同两个scanf函数一样,在scanf和gets中间需要一个 getchar(); 来吸收掉gets函数输入后的换行符,才能保证程序正常的运行。
3.复制字符串
(1)strcpy
strcpy
是 C 语言标准库函数之一,用于复制字符串。它的全称是 "string copy" 的缩写。strcpy
函数会将源字符串(包括空终止符 '\0')复制到目标字符串中。需要注意的是,目标字符串必须有足够的空间来容纳源字符串的内容,包括结尾的空字符,否则可能会导致缓冲区溢出,这是安全漏洞的常见来源。
函数原型定义在 <string.h>
头文件中,如下所示:
char *strcpy(char *dest, const char *src);
dest
是指向目标数组(即字符串)的指针,该数组必须足够大,以容纳要复制的字符串及其终止的空字符。src
是指向要复制的源字符串的指针。
strcpy
函数返回目标字符串 dest
的指针。
示例代码:
#include <stdio.h>
#include <string.h> int main() { char src[40] = "Hello, World!"; char dest[50]; // 确保有足够的空间 strcpy(dest, src); printf("Source: %s\n", src); printf("Destination: %s\n", dest); return 0;
}
输出:
Source: Hello, World!
Destination: Hello, World!
安全注意:
由于 strcpy
不会检查目标缓冲区的大小,因此在使用时需要特别小心,以避免缓冲区溢出。为了安全起见,可以考虑使用 strncpy
(如果目标缓冲区大小有限制)或 strlcpy
(在某些系统中可用,但不是标准 C 的一部分)等更安全的函数。此外,还可以使用 strncat
代替 strcat
,以及 snprintf
或 sprintf_s
(取决于编译器和平台)等更安全的函数来处理字符串的格式化。
(2)strncpy
strncpy
是 C 语言标准库中的一个函数,用于将一个字符串的前 n 个字符复制到另一个字符串中。这个函数允许程序员指定要复制的字符数,从而提供了一种比 strcpy
更安全的字符串复制方式,特别是当目标缓冲区的大小有限时。
函数原型
strncpy
函数的原型定义在 <string.h>
头文件中,其原型如下:
char *strncpy(char *dest, const char *src, size_t n);
dest
:指向目标字符串(即要复制到的位置)的指针。src
:指向源字符串(即要从中复制的字符串)的指针。n
:要复制的最大字符数(包括空字符 '\0',但实际操作中可能不包括自动添加的 '\0')。
函数行为
- 复制字符:
strncpy
将从src
指向的字符串中复制前n
个字符到dest
指向的数组中。 - 空字符处理:
- 如果
src
的长度小于n
,则dest
的剩余部分将被填充空字符 '\0'。 - 如果
src
的长度大于或等于n
,则dest
将不会被 '\0' 结尾,这可能导致字符串操作函数(如strlen
、strcpy
等)的行为异常。因此,在使用strncpy
后,通常需要手动确保目标字符串以 '\0' 结尾。
- 如果
- 返回值:
strncpy
返回dest
的指针。