字符串的输出

在C语言中,输出字符串的函数有两个:

puts():直接输出字符串,并且只能输出字符串。

printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。

这两个函数前面已经讲过了,这里不妨再演示一下,请看下面的代码:

#include

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

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

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() 读取缓冲区中剩下的内容。

关于缓冲区的知识,我们在《C语言缓冲区(缓存)详解》《结合C语言缓冲区谈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

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() 函数,它能避免空格的截断。

java输入一个字符给c赋值_C语言字符串的输入输出相关推荐

  1. 【Java】从键盘中任意输入一个字符,判断该字符的类别

    import java.io.*; public class Test {public static void main (String[] args) throws IOException{char ...

  2. Java学习之编写实现简单加密的程序,要求从键盘输入一个字符,输出加密后的字符。

    案例介绍: 编写实现简单加密的程序,要求从键盘输入一个字符,输出加密后的字符. 加密规则:输入A,输出Z;输入B,输出Y:输入a,输出z;输入b,输出y. 案例代码: import java.io.* ...

  3. Java中如何输入一个字符

    在一次编写代码时需要让程序接收一个字符,当我写出scanner.next时,我惊奇的发现,Scanner类中没有定义读取char的方法!!! Java中的扫描器类支持nextInt(),nextLon ...

  4. java怎么输入字符_java怎么输入一个字符

    思路: 先创建一个Scanner对象,调用Scanner对象的next()方法获取控制台输入的字符串,返回的是一个String类型,因为没有nextChar()方法,所以调用String的charAt ...

  5. 【Java】如何输入一个字符

    暑假开始学习Java啦. 在编写代码需要让程序接收一个字符时,当我依照nextInt(),nextLong(),nextDouble() 等写出 nextChar() 时,却惊讶地发现并没有nextC ...

  6. java输入字符scanner_在java 中怎么用scanner输入一个字符

    展开全部 System.out.println( "请输入一个字符:" ); char  src =  0 ; try { src = (char )System.in.read( ...

  7. 输入一个字符,判断它是否为小写字母,如果是,将其装换成大写字母,否则,不转换

    输入一个字符,判断它是否为小写字母,如果是,将其装换成大写字母,否则,不转换 大家好,我是萌新,初学者,这是第一次写博文,所以有些紧张,希望大家不要打我~谢谢 ##小写字母转换成大写字母 先说说我的思 ...

  8. 输入一个字符判断是数字还是字母 如果是字母是大写字母还是小写字母 是声母还是韵母

    输入一个字符判断是数字还是字母 如果是字母是大写字母还是小写字母 是声母还是韵母 运行结果 ASCII码表(字符代表的数值) 代码 //导包 import java.util.Scanner;//声明 ...

  9. java输入单个字符

    1 初学java时会发现 键盘录入数字类型的比较容易 而录入单个字符的实现就没有那么简单了 第一种方法:通过接收字符串 再接收其第一个字符 import java.util.Scanner; //导包 ...

最新文章

  1. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~
  2. springmvc 配置 fastjson解析器
  3. 抓取html 中文乱码,利用代码抓取网页数据,出现中文乱码问题
  4. boost::math模块使用 agm 以高精度计算 lemniscate 常量
  5. 在Application_Error事件中获取当前的Action和Control
  6. 使用wss和HTTPS / TLS保护WebSocket的安全
  7. show部分书...
  8. mybatis plus 格式话_作为阿里的面试官,我有话想说
  9. pytorch 解压kaggle中的zgz文件
  10. Out of resources when opening file './xxx.MYD' (Errcode: 24)
  11. @scheduled注解配置时间_《SpringBoot整合redis、Scheduled/quartz定时任务》
  12. 大数据概述(尚硅谷)
  13. mod sim tcp配置_ModSim32和ModScan32两种Modbus调试工具使用说明
  14. lan上网和adsl上网
  15. xcopy 跳过已经存在的_南京的野猪已经会逛奶茶店了?!
  16. esp32(ROS2foxy)之飞龙在天turtlesim最快能多快???
  17. python图像白色背景变透明
  18. js获取内网/局域网ip地址,操作系统,浏览器版本等信息
  19. 【数据库】SRA数据库介绍及数据下载
  20. Java千问:Java语言各种数字的“非常规”写法你都会吗?

热门文章

  1. mysql order by子查询_sql子查询 order by失效问题
  2. cuSPARSE库:(四)不同矩阵格式在内存中的存储方式
  3. Android Hello World 实例【TODO】
  4. 大型企业用什么orm_在大型仓储物流企业中使用什么类型的货架更为合适呢?
  5. 鼠标划过图片进行缩放效果
  6. html的标签位置属性(学习笔记)
  7. 思科c240 m3 服务器安装系统,2U机架式 思科UCS C240 M3让你心动
  8. 单体内置对象_单体内置对象
  9. frame越过另一个frame_一个价值2万美元的Facebook DOM XSS漏洞
  10. 牛客网matlab怎么输入数据,从牛客上找的面经