1. fgets() — 字符串输入

基本语法:

1
2
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);

示例+细节:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
char arr[100] = {0};

fgets(arr, sizeof(arr), stdin);

// 细节说明
// 1. stdid 是标准输入
// 2. 如果输入内容大于等于 sizeof(arr),fgets 只会取 sizeof(arr) - 1 个字符。
// 3. fgets 会将回车(换行符)读入
  1. Puts — 字符串输出

示例+细节:

1
2
3
4
#include <stdio.h>
char str[] = "hello maine....";
puts("%s", str);
// puts 和 printf 区别在于 puts 会在屏幕输出末尾自动加换行符,而 printf 不会
  1. Fputs — 字符串输出

和 printf 差不多。

示例+细节:

1
2
3
char str[] = "hello maine ...";
fputs(str, stdout);
// stdout 标准输出
  1. strlen – 计算字符串长度

示例+细节:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <string.h> 	// 必须包含的头文件
char str[] = "hello";
size_t len = strlen(str);
printf("%d \n", len);	// 输出 5,不会包含结束符,到结束符停止

char str2[] = "he\0llo";
len = strlen(str2);
printf("%d \n", len);	// 输出 2

len = sizeof(str2);
printf("%d \n", len);	// 输出 7,包含结束符,不受结束符影响

  1. Strcpy — 字符串拷贝
1
2
3
4
5
6
#include <string.h>		// 必须包含的头文件
char from[] = "hello maine";
char to[100];
strcpy(from, to);		// 拷贝字符串

// 遇到 \0 就停止拷贝。
  1. Strncpy – 拷贝指定长度字符串
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <string.h>
char from[] = "hello maine";
char to[] = "aaaaaaaaaaaaaaaaaaaaaaa";
strncpyto, from, sizeof(from));
printf("%s \n", to); 			// 后面带 a

strncpy(to, from, sizeof(from)+1);
printf("%s \n", to);			// 不带 a,到结束符停止

// strncpy 拷贝指定长度字符串,可以拷贝 \0 ,但 \0 后面的字符不会被拷贝。

  1. Strcmp 和 strncmp — 字符串比较
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <string.h>
char str1[] = "abc";
char str2[] = "abcd";

int res = strcmp(str1, str2);		// 整体比较 str2 > str1
int res2 = strncmp(str1, str2, 3);  // 比较前三个字符 str2 = str1
 
/**
	比较规则,逐个字符比较 ascii 码值得大小。
	如果 返回值 = 0 ,字符串相等
	如果 返回值 > 0 ,str1 > str2
	如果 返回值 < 0 ,str1 < str2
**/
  1. Strcat 和 strncat – 追加字符串
1
2
3
4
5
6
#include <string.h>
char from[] = " hello maine";
char to[100] = "abc";

strcat(to, from);	// abc hello maine
// strncat 可以指定长度
  1. Sprintf() 、sscanf()
1
2
3
4
5
6
7
int a = 10;
int b = 20;

printf("a = %d, b = %d \n", a ,b);	// 屏幕输出 a = 10, b = 20
char out[100];
sprintf(out, "a = %d, b = %d \n", a ,b); // 将输出保存到 out 中
printf("%s", out);
1
2
3
4
5
6

// scanf 从键盘获取输入,sscanf 按格式从字符串获取输入
char in[] = "a=10, b=20";
int a, b;
sscanf(in, "a=%d, b=%d", &a, &b);
printf("a=%d, b=%d \n", a, b);
  1. strstr 和 strchr — 字符串查询
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/**
	strchr() 查询字符串中是否包含某个字符,如果有则返回字符的地址,没有返回 N ULL
**/
char str[] = "sncjabkjdsvs";
char* p = strchr(str, 'j');
if(p == NULL)
{
    printf("没有找到字母 'j' \n");
} else {
    printf("%s \n", p);
}
1
2
3
4
5
6
7
8
9
// 查找字符串,同上
char str[] = "sncjabkjdsvs";
char* p = strstr(str, "kjd");
if(p == NULL)
{
    printf("没有找到字符串 'kjd' \n");
} else {
    printf("%s \n", p);
}
  1. strtok() – 字符串切割
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
char str[] = "nihao,ma,woh,en,hao";
char* p;
// strtok 会破坏原来的字符串
// 第一次切割,要传递字符串
p = strtok(str, ",");
while (p != NULL) {
    printf("%s ", p);
    // 第二次切割要传递 NULL,
    p = strtok(NULL, ",");
}
  1. atoi, atof, atol — 字符串转整型、浮点型、长整型
1
2
3
4
5
// 跳过前面的空格字符,直到遇到数字或者负号开始转换,
// 遇到非数字或者字符结束符停止
char str[] = "23ddv0"; // "232" ok, "343vf" ok, " 23cd" ok, "scs343c" 0;
int a = atoi(str);
printf("%d \n", a);