#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define N 4 // 定义字符串数组的大小(考虑字符串数组的空间能否装下输入的字符总数)
// 参数n是字符数组的大小
int getLine(char s[], int n, char* e);
void showInfo(char s[], int n, char c);
int getLine(char s[], int n, char* e) {
int j = 0, c = 0; // j保存从输入缓冲区读取的字符总个数
// i保存输入缓冲区字符的索引
for (int i = 0; i < n && (c = getchar()) != '\n'; ++i) {
// 如果读取到的字符是'\x1a'或'\n'或EOF等等, 不保存到字符串数组中, (\x1a是ctrl的ASCII码)
// 拦截ASCII码表中0x00到0x1F对应包含了Ctrl+A到Ctrl+Z的操作, '\n', '\x1a'等等
if (c >= '\x00' && c <= '\x1F' || c == EOF) {
if (c == '\x1a') // 遇到ctrl键的ASCII码该行字符结束录入
break;
}
else {
s[i] = c; // 将接收到的字符保存起来
j = i + 1; // 字符串的长度提前增长一,便于下一个字符的收集
}
}
// 从输入缓冲区获取的字符总数大于字符串的可容纳空间
if (j >= n) {
j = n - 1; // 将字符长度指定为字符串数组的长度减1
*e = s[n - 1];
while (getchar() != '\n'); // 清理残存在输入缓冲区中的字符(s)
}
s[j] = '\0'; // 循环结束,j指向字符串的尾部,要为字符串添加结束符
return j; // 返回字符串的字符个数(不包含'\0'在内)
}
void showInfo(char s[], int n, char c) {
// 输出数组中所有字符
if (c != '\n')
printf("当数组大小小于输入缓冲区字符的总数时, 数组的最后一个元素%c被\\0覆盖\n", c);
printf("数组的大小 = %d ", n);
printf("数组的元素 = [%s", s);
puts("\\0]");
// 输出字符串中所有字符
printf("字符串长度 = %d ", strlen(s));
printf("字符串元素 = [%s]\n", s);
}
int main() {
char s[N], c = '\n';
int len = getLine(s, N, &c);
showInfo(s, len + 1, c);
return 0;
}