c notes - nonelittlesong/study-cpp GitHub Wiki

string

puts()

// strings1.c
#include <stdio.h>
#define MSG "I am a symbolic string constant."
#define MAXLENGTH 81
int main(void)
{
    char words[MAXLENGTH] = "I am a string in an array.";
    const char* pt1 = "Something is pointing at me.";
    puts("Here are some strings:");
    puts(MSG);
    puts(words);
    puts(pt1);
    words[8] = 'p';
    puts(words);

    return 0;
}

和printf()函数一样,puts()函数也属于stdio.h系列的输入/输出函数。
与printf()不同的是,puts()只能显示字符串,并自动加上换行符。

字符串字面量

双引号被视为指向字符串的指针

#include <stdio.h>
int main(void)
{
    printf("%s, %p, %c\n", "we", "are", *"friends");
    return 0;
}

返回结果

we, 0x********, s

字符数组

// 可以自动确定数组大小
const char m2[] = "if you cant think of anything, fake it.";
// 指针形式
const char* m2 = "if you cant think of anything, fake it.";

char[] 与 char*的区别

m2[]:

  • 字符串有两个副本:一个静态内存中的字符串字面量,一个存储在m2[]中的字符串
  • m2是地址常量

*m2:

  • 一个静态内存的字符串字面量,一个指针
  • m2指向的数据不可变(改变的结果是未定义的)

字符串数组

指针数组效率更高,但是不能改变指向的字符串字面量(未定义)。

分配空间

假如编写了下面的代码:

char *name;
scanf("%s", name);

虽然可能通过编译(warning),但name是一个未初始化的指针,可能指向任何地方。 读入name时,可能会擦出程序中的数据或代码,导致程序异常终止。

fgets()和fputs()

fgets(s, len, in)
fputs(s, out)

⚠️ **GitHub.com Fallback** ⚠️