跳至主要內容

5-字符串

黑静美原创...大约 5 分钟编程CcppC井

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;
}
img
img
img
img

一个字符串也可以声明为一组字符,如下:

#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
img
img

(否则)

img
img
字符是用单引号 ' 括起来的。

与任何数组一样,字符串的名也为一个指针。

字符串是用双引号 " 括起来的文本。
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;
}

上次编辑于:
贡献者: Heijingmei
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3