输入一行字符串,并存储在字符数组中。输入的字符串长度未知,以换行为结束,中间不包含空格。

%s 读入字符串

%s 读入字符串,编译器会自动在字符串的末尾加上零终止符 '\0'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main() {
// 最多输入 99 个字符的字符串 + 1 个字符串的零终止符 '\0'
char str[100];

// scanf("%s", str);
scanf_s("%s", str, 100); // 字符数组开多大这里 str 后面的数字就写多大

// 输出字符串进行验证,%s 和 puts() 会输出字符数组中零终止符之前的所有字符
printf("%s\n", str);
// puts(str);

return 0;
}

gets() 读入字符串

gets() 读入字符串,编译器会自动在字符串的末尾加上零终止符 '\0'

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main() {
char str[100];

// gets(str);
gets_s(str, 100); // 字符数组开多大这里 str 后面的数字就写多大

printf("%s\n", str);
// puts(str);

return 0;
}

%c 循环读入字符串

%c 按字符,不断循环读入字符串,需要手动在字符串的末尾加上零终止符 '\0'

如果以 %c 按字符循环输出,可以不手动添加零终止符,但是任何依赖于零终止符的字符串函数都会出现问题。

或者可以对字符数组进行初始化赋值,例如 char str[100] = { '\0' }; 这样也不用手动添加零终止符 '\0'

while 循环

对输入的字符进行判断并作为循环判断的条件,这里不能用 scanf 替代 getchar()

因为 (ch = getchar()) != '\n' 等同于 ch = getchar(); ch !='\n' ,而 scanf 的返回值并不是输入的字符 ch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

int main() {
char str[100];
// char str[100] = { '\0' }; // 将字符数组全部初始化为零终止符,就不用手动添加零终止符了
char ch;
int len = 0;
while ((ch = getchar()) != '\n') { // 输入的字符串以按下 Enter 换行结束
str[len++] = ch; // 这里的 len 有一个记录字符串长度的作用
}
str[len] = '\0'; // 手动在字符串的末尾加上零终止符 '\0'

// printf("%s\n", str);
// puts(str);
// 也可以 %c 按字符循环输出
for (int i = 0; i < len; i++) { // strlen() 计算字符串的长度也是依赖于零终止符判断的
printf("%c", str[i]);
}
printf("\n");

return 0;
}

也可以写一个死循环不断的读入字符,直到判定字符串输入结束后将循环 break 。

这里可以用 scanf 替代 getchar()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int main() {
char str[100];

char ch;
int len = 0;
while (scanf_s("%c", &ch)) {
if (ch == '\n') {
str[len] = '\0'; // 手动加上字符串的零终止符 '\0'
break;
} else {
str[len] = ch;
}
len++;
}

// printf("%s\n", str);
// puts(str);
// 也可以 %c 按字符循环输出
for (int i = 0; i < len; i++) { // strlen() 计算字符串的长度也是依赖于零终止符判断的
printf("%c", str[i]);
}
printf("\n");

return 0;
}

for 循环

其实就是将 while 循环语句转为 for 循环语句,这里只写一个例子作为参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

int main() {
char str[100];

char ch;
int len = 0;
for (; (ch = getchar()) != '\n'; len++) {
str[len] = ch;
}
// for (; (ch = getchar()) != '\n';) {
// str[len++] = ch;
// }
str[len] = '\0';

// printf("%s\n", str);
// puts(str);
// 也可以 %c 按字符循环输出
for (int i = 0; i < len; i++) { // strlen() 计算字符串的长度也是依赖于零终止符判断的
printf("%c", str[i]);
}
printf("\n");

return 0;
}