有空格字符型数组的输入

有空格字符型数组的输入如何在C/C++中如何实现呢?接下来为大家提供几种方法。

文章目录

  • 前言
  • 一、有空格字符型数组的输入
    • 1. scanf和cin
    • 2.fgets
    • 3.getchar
    • 4.scanf
  • 总结


前言

无空格字符型数组可以直接输入和输出,如果数组内存入的字符是一个一个的,也可以通过合理使

用循环语句进行输出,那么包含空格的字符型数组如何输入呢,让我们来学习一下。


一、字符型数组的输入

1.scanf和cin

scanf

代码如下(示例):

#include <cstdio>
int main()
{
    char arr[20] = { 0 };//输⼊

    scanf("%s", arr);//输出

    printf("%s", arr);
    return 0;
}

当输⼊"abcdef"的时候,实际上scanf只读取了abc就结束了,也就是相当于遇到空格就结束了。

运行结果如下:

✅这⾥特别说⼀下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个 ⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。 因为 %s 的读取不会包含空白字符,所以⽆法⽤来读取多个单词,除非多个 %s ⼀起使⽤。 这也意味着, scanf() 不适合读取可能包含空格的字符串,比如书名或歌曲名。另外有⼀ 个细节注意⼀下, scanf() 遇到 %s 占位符,会在字符串变量末尾存储⼀个 \0 字符。

同时 scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串 时,很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤ %s 占位符时,可以 指定读⼊字符串的最长长度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表⽰读取字符串的最⼤长度,后⾯的字符将被丢弃。

#include <cstdio>

int main()
{
    char name[11];
    scanf("%10s", name);
    
    return 0;

}

上面示例中, name 是⼀个⻓度为11的字符数组, scanf() 的占位符 %10s 表⽰最多读取⽤⼾输⼊ 的10个字符,后⾯的字符将被丢弃,这样就不会有数组溢出的风险了。

可以用 %[n]s 的格式来限制输入的长度。

cin

#include <iostream>
using namespace std;

int main()
{
    char arr[20] = { 0 };

    cin >> arr;//输入

    cout << arr << endl;//输出
    return 0;
}

运行截图如下:

结果也是⼀样,没有任何区别。

✅其实cin在读取⼀个字符串的时候,在遇到空白字符的时候,就认为字符串结束了,不再继续往后读取剩余的字符,同时将已经读取到的字符串末尾加上\0,直接存储起来。

解决办法如下:

2.fgets

fgets 也是从第⼀个字符开始读取,最多读取 num-1 个字符,最后⼀个位置留给 \0 ,如果num 的⻓度是远大于输⼊的字符串⻓度,就会⼀直读取到 \n 停⽌,并且会读取 \n ,将 \n 作 为读取到内容的⼀部分,同时在读取到的内容后⾃动加上 \0 。

fgets的格式如下

char * fgets ( char * str, int num, FILE * stream );

char * str  代表数组的名字

int num  代表输入字符串就长度

FILE * stream  代表输入的方式

比如键盘输入就可以写stdin。

代码如下(示例):

#include <cstdio>

int main()
{
    char arr[10] = { 0 };

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

    printf("%s\n", arr);
    return 0;
}

运行结果如下:

3.getchar

代码如下:

#include <cstdio>

int main()
{
    char arr[10] = { 0 };
    int ch = 0;
    int i = 0;

    while ((ch = getchar()) != '\n')
    {
        arr[i++] = ch;

    }
    printf("%s\n", arr);

    return 0;
}

运行结果如下:

注意一点,在使用getchar这个库函数的时候,他的返回值是整形!!!

4.scanf

这个方法不常见,可以忽略,也可以了解一下

代码如下:

#include <cstdio>

int main()
{
    char arr[10] = "xxxxxxxx";

    scanf("%[^\n]s", arr);

    printf("%s\n", arr);
    return 0;
}

运行结果如下:

scanf 函数其实也能做到读取带有空格的字符串,只是不常见而已。⽅式就是 将 "%s" 改成 "%    [^  \n]s" ,其中在 % 和 s 之间加上了 [ ^ \n] ,意思是⼀直读取,直到遇到\n ,这样即使遇到空格也就不会结束了。 这种⽅式读取,不会将 \n 读取进来,但是在读取到的字符串末尾加上 \0 。


总结

这就是所有有空格字符型数组的输入,感谢观看,祝大家共同进步。

### 字符型数组输入处理的方法 在 C 语言中,字符型数组输入可以通过多种方式实现,具体取决于需求以及使用的标准库函数。以下是几种常见的字符型数组输入方法及其特点: #### 使用 `gets` 函数 `gets` 是一种简单的方式用于接收用户输入的一整行字符串,并将其存储到字符数组中。然而需要注意的是,`gets` 不会检查缓冲区溢出问题,因此存在安全隐患,在现代编程实践中已被废弃。 ```c #include <stdio.h> #include <string.h> int main(void) { int i = 0; char s[10] = {}; gets(s); printf("%ld\n", strlen(s)); return 0; } ``` 上述代码展示了通过 `gets` 获取用户输入并打印长度的过程[^1]。尽管如此,推荐使用更安全的替代方案来代替 `gets`。 #### 利用 `scanf` 进行输入 当利用 `scanf` 对于字符数组进行数据填充时,需特别留意式控制符 `%s` 的行为——它只会读取直到遇到空白字符为止的内容;如果希望获取包含空格在内的整个字符串,则不适合单独依靠 `%s` 完成任务。 另外值得注意的一个细节就是:如果把字符数组的名字作为参数传递给 `scanf` 而不是指针变量的话,那么就不应该再附加地址运算符 `&` ,因为本身已经是一个指向首元素位置的有效地址值了[^5]。 #### 借助 `cin.get()` 或其他高级 IO 流操作(针对 C++) 对于更加复杂的场景或者追求更高的灵活性来说,可以考虑采用基于对象导向设计模式下的文件流类所提供的成员方法来进行交互式通信。比如下面这个例子就演示了怎样借助 C++ STL 中定义好的 istream 类型对象调用 get 成员函数从而达到逐字节捕获键盘敲击效果的目的。 虽然这里讨论的主题围绕着C语言展开论述,但是提及一下跨平台兼容性强的语言特性也是很有必要的。例如,在某些特定场合下可能需要用到如下所示形式完成类似功能的操作: ```cpp char ch; while ((ch = cin.get()) != '\n') { cout << ch; } cout << endl; ``` 以上片段表明即使面对多单词组成的短语也能妥善应对[^3]。 #### 动态分配内存创建变长大小的字符容器 最后不得不提的就是有关动态开辟空间的技术手段应用方面的话题了。有时候我们事先并不能确切知道究竟需要多少容量去容纳最终的结果集,这时候就可以运用 malloc/realloc/free 组合拳出击解决问题啦! 举个实际的例子来讲吧,假设现在有一个需求是要让用户自由决定要转化几个十进制正整数成为对应的二进制表现形式的同时还要计算每一个目标数值里边含有多少数量级上的‘1’位数。这个时候我们就得想办法让程序能够适应不同规模的数据集合咯~ ```c #include <stdlib.h> ... void main(){ ... int *binaryNum = (int *)malloc(sizeof(int)*initialSize); // initial guess on size needed. if(!binaryNum){ perror("Memory allocation failed"); exit(EXIT_FAILURE); } /* Code block handling dynamic resizing omitted */ free(binaryNum); } ``` 综上所述,无论是静态声明固定尺寸还是运行期间灵活调整边界范围内的各种可能性都被充分考虑到并且给出了相应的解决方案建议供参考选用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值