c notes - nonelittlesong/study-cpp GitHub Wiki
// 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.";
m2[]:
- 字符串有两个副本:一个静态内存中的字符串字面量,一个存储在m2[]中的字符串
- m2是地址常量
*m2:
- 一个静态内存的字符串字面量,一个指针
- m2指向的数据不可变(改变的结果是未定义的)
指针数组效率更高,但是不能改变指向的字符串字面量(未定义)。
假如编写了下面的代码:
char *name;
scanf("%s", name);
虽然可能通过编译(warning),但name是一个未初始化的指针,可能指向任何地方。 读入name时,可能会擦出程序中的数据或代码,导致程序异常终止。
fgets(s, len, in)
fputs(s, out)