C语言如何定义字符串?(2种方法)

    2026-01-12 13:08:03

    在C语言中,字符串是一种特殊的字符数组,以空字符'\0'结尾。C语言没有专门的字符串类型,而是使用字符数组或字符指针来表示字符串,这两种方式各有优缺点,适用于不同的场景。

    使用字符数组定义字符串

    字符数组是定义字符串最直观和常用的方式。当使用字符数组定义字符串时,我们需要为数组分配足够的空间来容纳字符串内容和结尾的空字符。

    定义字符数组的一般语法如下:

    char string_name[size];

    其中,string_name 是数组名称,size 是数组的大小,应该比字符串的实际长度至少大 1,以容纳结尾的空字符。

    让我们看一些使用字符数组定义字符串的例子:

    #include

    int main() {

    // 方法 1:声明并初始化

    char greeting[] = "Hello, World!";

    // 方法 2:先声明后赋值

    char message[20];

    strcpy(message, "Welcome to C!");

    // 方法 3:字符逐个赋值

    char name[10] = {'J', 'o', 'h', 'n', '\0'};

    // 输出字符串

    printf("%s\n", greeting);

    printf("%s\n", message);

    printf("%s\n", name);

    return 0;

    }

    输出结果:

    Hello, World!

    Welcome to C!

    John

    使用字符数组定义字符串的优点是简单直观,可以直接修改字符串的内容。但是,字符数组的大小是固定的,一旦定义就不能改变,这可能会导致内存浪费或者溢出的问题。

    使用字符指针定义字符串

    字符指针是另一种定义字符串的方式,它更加灵活,但也需要更多的注意事项。使用字符指针定义字符串时,我们实际上是创建一个指向字符串首字符的指针。

    定义字符指针的一般语法如下:

    char *string_name;

    让我们看一些使用字符指针定义字符串的例子:

    #include

    #include

    #include

    int main() {

    // 方法 1:指向字符串常量

    char *greeting = "Hello, World!";

    // 方法 2:动态分配内存

    char *message = (char *)malloc(20 * sizeof(char));

    strcpy(message, "Welcome to C!");

    // 方法 3:指向字符数组

    char name[] = "John";

    char *name_ptr = name;

    // 输出字符串

    printf("%s\n", greeting);

    printf("%s\n", message);

    printf("%s\n", name_ptr);

    // 释放动态分配的内存

    free(message);

    return 0;

    }

    输出结果:

    Hello, World!

    Welcome to C!

    John

    使用字符指针定义字符串的优点是灵活性高,可以动态分配内存,适合处理长度不确定的字符串。但是,使用字符指针也需要注意一些潜在的问题,比如内存泄漏和指针悬挂等。

    字符数组和字符指针的区别和注意事项

    虽然字符数组和字符指针都可以用来表示字符串,但它们有一些重要的区别:

    内存分配:字符数组在栈上分配固定大小的内存,而字符指针可以指向栈上的数组,也可以指向堆上动态分配的内存。

    可修改性:使用字符数组定义的字符串可以直接修改其内容,而指向字符串常量的字符指针不能修改其内容(这样做会导致未定义行为)。

    大小调整:字符数组的大小是固定的,而使用字符指针可以通过重新分配内存来调整字符串的大小。

    函数参数:当作为函数参数传递时,字符数组会退化为指针,因此在函数内部无法获知原数组的大小。

    sizeof 运算符:对字符数组使用 sizeof 会返回整个数组的大小,而对字符指针使用 sizeof 只会返回指针本身的大小(通常是 4 或 8 字节)。

    下面是一个展示这些区别的示例:

    #include

    #include

    void print_string_info(char *str) {

    printf("String: %s\n", str);

    printf("sizeof in function: %zu\n", sizeof(str));

    }

    int main() {

    char arr[] = "Hello";

    char *ptr = "World";

    printf("Array string:\n");

    printf("Content: %s\n", arr);

    printf("sizeof: %zu\n", sizeof(arr));

    arr[0] = 'h'; // 可以修改

    printf("Modified: %s\n", arr);

    print_string_info(arr);

    printf("\nPointer string:\n");

    printf("Content: %s\n", ptr);

    printf("sizeof: %zu\n", sizeof(ptr));

    // ptr[0] = 'w'; // 不能修改,会导致未定义行为

    print_string_info(ptr);

    return 0;

    }

    输出结果:

    Array string:

    Content: Hello

    sizeof: 6

    Modified: hello

    String: hello

    sizeof in function: 8

    Pointer string:

    Content: World

    sizeof: 8

    String: World

    sizeof in function: 8

    在选择使用字符数组还是字符指针来定义字符串时,需要根据具体的使用场景来决定。如果字符串的长度是固定的,并且需要频繁修改字符串的内容,那么使用字符数组可能更合适。如果需要处理长度可变的字符串,或者需要在运行时动态分配内存,那么使用字符指针会更灵活。无论选择哪种方式,都要注意正确管理内存,避免内存泄漏和缓冲区溢出等问题。