C语言如何输入一个字符串?

简介: 整个字符串处理在scanf()和printf()函数中,%s指的就是字符串所以我们就可以使用scanf("%s",str)和printf("%s",str)从键盘处读取字符串并将字符串打印出来

用scanf输入字符串(有限制)


整个字符串处理

在scanf()和printf()函数中,%s指的就是字符串

所以我们就可以使用scanf("%s",str)和printf("%s",str)从键盘处读取字符串并将字符串打印出来


代码如下:


int main()
{
  char str[10] = { 0 };
  scanf("%s", str);
  printf("%s", str);
  return 0;
}


这里要注意的一点是:在scanf函数中,后面的参数必须是一个地址,如输入一个整形变量:scamf("%d",&a),都需要进行&取地址操作

但是数组名就已经是地址了(详解请点击观看我的一篇关于数组名到底是什么的文章)

所以直接用数组名即可,不用进行取地址


如果我们输入一个连续的字符串如:abcde,这段代码会正常运行

f7e140af38bf4f2b8e2ada8d80aab0d8.png

然而,如果输入一个非连续,也就是中间有空格的字符串时,代码只会打印出第一个空格以前的内容


f6a20dd4c2c346ca87c70a064573fe42.png

这是因为在键盘与scanf函数中,存在一个输入缓冲区,从键盘输入的内容会存放到这个缓冲区中


ca6031b61ff449f996b3d7409d4fbe00.png

而scanf并不会读取走空格,它只能读取走字符以及字符串

例如当从键盘输入字符串abc 123(注意abc与123之间是有一个空格的),在缓冲区中如图:

82898e4b9c7f48df83ff20948e7137bf.png

scanf首先会将字符串abc取走,然后在abc后面有一个空格,scanf无法读取走空格,所以虽然从键盘输入abc 123,但是最后只有abc被存放在了str中

所以最后只输出了abc


总结一下scanf:

输入值之前的空白(空格、制表符、换行符)会被跳过,输入值之前的空白表示结束。因此,用%s格式码输入字符时,中间不能包括空白


这里注意的是:前面讲的scanf无法读取输入缓冲区中的空格甚至是回车,这里的scanf指的是scanf("%s",str),只是函数中是%s才无法读取,而如果是scanf("%c",&character),输入一个字符,对于空格和回车都是能正常输入的,这里不要弄混


所以,用scanf接受字符串是有局限性的。


逐个字符处理

前面已经讲了,用scanf接受字符串是由局限性的,当字符串中含有空格,scanf函数只能读取第一个空格以前的字符串,但是如果非要用scanf进行接受字符串,只能是逐个字符处理


代码如下:


#include<stdio.h>
int main()
{
  char ch[10]; 
  for (int i = 0; i < 10; i++)
  {
  scanf("%c", &ch[i]);
  }
  for (int i = 0; i < 10; i++)
  {
  printf("%c", ch[i]);
  }
  return 0;
1


这样也可以进行对于字符串的输入以及输出


用getchar()输入字符串


getchar()与scanf最大的区别就是,getchar可以读取走输入缓冲区中的空格以及回车


这里的内容我i之前有一篇文章进行了详细讲解,请点击查看


代码如下:
int main()
{
  char str[20] = { 0 };
  char ch = 0;
  while ((ch = getchar()) != '\n')
  {
  putchar(ch);
  }
  return 0;
}


用gets()输入字符串(简单快捷)


这里介绍一个新的函数gets(),此函数在头文件string.h中,使用此函数需要加头文件#include <string.h>

gets函数的官方格式: char * gets ( char * str );

在参数列表中,需要传一个字符型指针,也就是我们要输入的字符串的名(数组的名)

gets()函数的主要作用就是接受从键盘输入的一个字符串

gets当遇到换行符\n或者EOF时停止,并将读取的结果存放在str指针所指字符数组中

#include <stdio.h>
#include<string.h>
int main()
{
  char str[10];
  printf("请输入字符串");
  gets(str);
  printf("请输出字符串");
  printf("%s", str);
  return 0;
}


输入带有空格的字符串也可以正常输出


11ed6babf2864c0ca6a7981333688ee7.png

其实还存在一个与gets函数配套的函数puts函数,用来输出字符,具体用法与printf和putchar无差别


#include <stdio.h>
#include<string.h>
int main()
{
  char str[10];
  printf("请输入字符串: ");
  gets(str);
  printf("请输出字符串: ");
  puts(str);
  return 0;
}


gets函数与scanf、getchar的一些区别

在前面的scanf函数和getchar函数中,回车都需要值得注意,但是在get函数中,回车不作为读取内容,遇到回车时,系统自动用\0代替回车\n,所以输入一行字符串后按下回车,就完成了一次输入


gets函数一遇到回车就结束,并把这个回车从缓冲区中移走,这点与scanf不同,scanf是遇到回车,空格就结束,但并不会将回车、空格从缓冲区中移走


gets函数只会遇见回车时结束遇到空格、制表符都会正常读取,而scanf遇到空格、回车、制表符都会结束,getchar遇到空格、回车、制表符都正常读取

75ce7cd8ad8848bd8939bb6a18e2b802.png


目录
相关文章
|
5月前
|
NoSQL 程序员 Redis
C语言字符串的设计缺陷
C语言字符串的设计缺陷
53 1
|
1月前
|
C语言 C++
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
|
2月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
2月前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
135 7
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
2月前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
|
3月前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
31 4
|
3月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
63 0
|
3月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
55 0
|
5月前
|
C语言
C语言学习笔记之初识字符串
C语言学习笔记之初识字符串
42 5