C语言的字符串输入输出

原创 2016年05月30日 21:26:13

字符串的输出


在C语言中,输出字符串的函数有两个:
puts():直接输出字符串,并且只能输出字符串。
printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。


这两个函数前面已经讲过了,这里不妨再演示一下,请看下面的代码:
#include <stdio.h>
int main(){
    int i;
    char str[] = "http://c.biancheng.net";
    printf("%s\n", str);  //通过变量输出
    printf("%s\n", "http://c.biancheng.net");  //直接输出
    puts(str);  //通过变量输出
    puts("http://c.biancheng.net");  //直接输出
    return 0;
}
运行结果:
http://c.biancheng.net
http://c.biancheng.net
http://c.biancheng.net
http://c.biancheng.net


在 printf() 函数中使用%s输出字符串时,在变量列表中给出数组名即可,不能写为printf("%s", str[]);。
字符串的输入


在C语言中,输入字符串的函数有两个:
scanf():通过格式控制符 %s 输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
gets():直接输入字符串,并且只能输入字符串。
1) 使用 scanf() 读取字符串


请先看下面的例子:
#include <stdio.h>
int main(){
    char str1[30], str2[30];
    printf("Input str1: ");
    scanf("%s", str1);
    printf("Input str2: ");
    scanf("%s", str2);
    printf("str1: %s\nstr2: %s\n", str1, str2);
    return 0;
}
运行结果:
Input str1: c.biancheng.net↙
Input str2: Java Python C-Sharp↙
str1: c.biancheng.net
str2: Java


由于字符数组长度为30,因此输入的字符串长度必须小于30,以留出一个字节用于存放字符串结束标志`\0`。


对程序的说明:
① 我们本来希望将 "Java Python C-Sharp" 赋值给 str2,但是 scanf() 只读取到 "Java",这是因为 scanf() 读取到空格时就认为字符串输入结束了,不会继续读取了。请看下面的例子:
#include <stdio.h>
int main(){
    char str1[20], str2[20], str3[20];
    printf("Input string: ");
    scanf("%s", str1);
    scanf("%s", str2);
    scanf("%s", str3);
    printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
    return 0;
}
运行结果:
Input string: Java Python C-Sharp↙
str1: Java
str2: Python
str3: C-Sharp


第一个 scanf() 读取到 "Java" 后遇到空格,结束读取,将"Python C-Sharp" 留在缓冲区。第二个 scanf() 直接从缓冲区中读取,不会等待用户输入,读取到 "Python" 后遇到空格,结束读取,将 "C-Sharp" 留在缓冲区。第三个 scanf() 读取缓冲区中剩下的内容。


② 在《从键盘输入数据》中讲到,scanf 的各个变量前面要加取地址符&,用以获得变量的地址,例如:
int a, b;
scanf("%d %d", &a, &b);
但是在本节的示例中,将字符串读入字符数组却没有使用&,例如:
char str1[20], str2[20], str3[20], str4[20];
scanf("%s %s %s %s",str1, str2, str3, str4);
这是因为C语言规定,数组名就代表了该数组的地址。整个数组是一块连续的内存单元,如有字符数组char c[10],在内存可表示为:


C语言还规定,数组名所代表的地址为第0个元素的地址,例如char c[10];,c就代表c[0]的地址。第0个元素的地址就是数组的起始地址,称为首地址。也就是说,数组名表示数组的首地址。


设数组c的首地址为0X2000,也即c[0]地址为0X2000,则数组名c就代表这个地址。因为c已经表示地址,所以在c前面不能再加取地址符&,例如写作scanf("%s",&c);是错误的。


有了首地址,有了字符串结束符'\0',就可以在内存中完整定位一个字符串了。例如:
printf("%s", c);
printf 函数会根据数组名找到c的首地址,然后逐个输出数组中各个字符直到遇到 '\0' 为止。
int、float、char 类型的变量表示数据本身,数据就保存在变量中;而数组名表示的是数组的首地址,数组保存在其他内存单元,数组名保存的是这块内存的首地址。后面我们会讲解指针,大家将会有更加深刻的理解。
2) 使用 gets() 读取字符串


gets 是 get string 的缩写,意思是获取用户从键盘输入的字符串,语法格式为:
gets(arrayName);
arrayName 为字符数组。从键盘获得的字符串,将保存在 arrayName 中。请看下面的例子:
复制纯文本新窗口


#include <stdio.h>
int main(){
    char str1[30], str2[30];
    printf("Input str1: ");
    gets(str1);
    printf("Input str2: ");
    gets(str2);
    printf("str1: %s\nstr2: %s\n", str1, str2);
    return 0;
}
运行结果:
Input str1: Java Python C-Sharp↙
Input str2: http://c.biancheng.net↙
str1: Java Python C-Sharp
str2: http://c.biancheng.net


可以发现,当输入的字符串中含有空格时,输出仍为全部字符串,这说明 gets() 函数不会把空格作为输入结束的标志,而只把回车换行作为输入结束的标志,这与 scanf() 函数是不同的。


总结:如果希望读取的字符串中不包含空格,那么使用 scanf() 函数;如果希望获取整行字符串,那么使用 gets() 函数,它能避免空格的截断。


题目:输入一串字符串,含数字 字母,取出数字并排序。

例题:
#include <stdio.h>
void main()
{
 char c[20],i,c1[20],j,t;
 for(i=0;i<20;i++)
  c1[i]=c[i]='\0';//对字符数组赋初值,后面可以用来判断输入了几个字符
 printf("输入一串字符:\n");
 scanf("%c",c);
 for(i=0;c[i]!='\n'&&i<20;)//输入字符,当按回车时,说明字符输入完毕
 {
  i++;
  c[i]=getchar();
 }
 for(i=0,j=0;i<20;i++)//将其中为数字的提取出来
 {
  if(c[i]=='\0') break;
  if(c[i]>='0'&&c[i]<='9')
   c1[j++]=c[i];
 }
 for(i=0;i<20;i++)//对提取出来的数字排序
 {
  if(c1[i]=='\0') break;
  j=0;
  for(;j<i;j++)
  {
   if(c1[i]>c1[j])
   {
    t=c1[i];
    c1[i]=c1[j];
    c1[j]=t;
   }
  }
 }
 printf("%s\n",c1);//输出

版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言字符串输入与输出函数

字符串输入&输出
  • RHEL_admin
  • RHEL_admin
  • 2015年01月15日 14:57
  • 23396

C语言编程(练习4:字符输入和输出 )

题目: 编写一个程序,以每行一个单词的形式打印其输入 分析: 一个单词中不能出现空格,制表符,换行符如何确定两个单词间有多个空白字符的情况空白字符的判断可以用符号分类函数库来判断:ctype.h ...
  • yiting52
  • yiting52
  • 2015年01月13日 16:56
  • 790

【C语言】如何实现多行字符串的输入 并 将文本打印在屏幕上?

使用字符串数组作为一个简单的文本编辑器的基础。 接受多行输入,直到接受一个空行,结束输入,将输入的所有行打印在屏幕上。实现的精彩瞬间: 1.宏定义将该字符的大小确定 2.字符串函数的使用gets...
  • lizhidefengzi
  • lizhidefengzi
  • 2016年11月11日 03:03
  • 4505

C语言数据输入与输出

C语言数据输入与输出
  • ITTechnologyHome
  • ITTechnologyHome
  • 2016年06月02日 11:06
  • 10396

输入输出原理与C语言标准输入输出函数

#include Sleep(1);沉睡一秒       输入输出原理: 输入:当键盘按下按键之后程序读取到数据        流程 1、键盘缓冲区:键盘的内部有一块微处理器,它控制...
  • pangyaojian
  • pangyaojian
  • 2014年07月02日 16:14
  • 1769

C语言输入与输出

调试环境:win10+vs2015 声明:本篇博客主要讲怎样使用C语言标准库里面的输入输出函数输入输出简单机制我们在使用输入输出函数的时候,不管是从文件还是控制台,它都是会先存放在缓冲区里面,但需要...
  • baidu_27435045
  • baidu_27435045
  • 2016年11月23日 22:53
  • 2025

C语言的基本输入与输出函数(全解)

C语言的基本输入与输出函数 1.1.1 格式化输入输出函数   Turbo C2.0 标准库提供了两个控制台格式化输入、 输出函数printf() 和scanf(), 这两个函数可以在标准输入输出设备...
  • dingding3w
  • dingding3w
  • 2015年06月24日 17:36
  • 14034

c语言输入输出多个字符串

#include #include int main() { char str[50][50]; char *ps[50]; int i,n=0,m=0; scanf("%d%d",&n...
  • svap1
  • svap1
  • 2015年01月15日 14:01
  • 4328

C语言学习笔记——格式化输入输出

输入可以有三种方式:scanf(),getchar(),gets(),它们有哪些区别呢? 1.  scanf() 功 能: 执行格式化输入 用 法: int scanf(char *forma...
  • xinianbuxiu
  • xinianbuxiu
  • 2016年07月14日 18:16
  • 725

c语言中输入输出格式的控制

C语言中输入格式与输出格式的控制
  • wangjiaweiwei
  • wangjiaweiwei
  • 2014年09月16日 14:12
  • 1392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言的字符串输入输出
举报原因:
原因补充:

(最多只允许输入30个字)