-
C++学习笔记之 printf输出字符串
2018-10-12 11:26:16printf输出字符串 leetcode的练习14——最长公共前缀,遇到打印字符串的问题 string ss = { "\0" }; Solution sol1; ss=sol1.longestCommonPrefix(s1); printf("%s\n", &ss); ss是...printf输出字符串
leetcode的练习14——最长公共前缀,遇到打印字符串的问题
string ss = { "\0" }; Solution sol1; ss=sol1.longestCommonPrefix(s1); printf("%s\n", &ss);
ss是一个string类型的变量,原本想通过printf直接打印字符串,结果以上方式输出乱码
于是上网找答案,居然惊讶的发现printf输出字符串是针对char *的,换言之,printf只能输出C语言中的内置数据,string不是c语言内置数据。
更深入的来说:ss这个string类型的对象并非单单只有字符串,其内还有许多用于操作的函数,于是&ss并非字符串的首地址,而是ss这个对象的首地址。所以要做如下操作:
printf("%s\n", ss.c_str());string中c_str()成员方法返回当前字符串的首字符地址
或cout<也可以达到这个目的。
-
printf输出字符串的一些格式
2016-11-04 17:15:20printf输出字符串的一些格式 2008-11-26 14:50:11 +--------------------------------------------+ | 主题: 使用printf输出各种格式的字符串 | | | | 日期: 2004-06-29printf输出字符串的一些格式 2008-11-26 14:50:11+--------------------------------------------+
| 主题: 使用printf输出各种格式的字符串 |
| |
| 日期: 2004-06-29 |
+--------------------------------------------+
1. 原样输出字符串:
printf("%s", str);
2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐:
printf("%Ns", str); --N 为指定长度的10进制数值
3. 输出指定长度的字符串, 超长时不截断, 不足时左对齐:
printf("%-Ns", str); --N 为指定长度的10进制数值
4. 输出指定长度的字符串, 超长时截断, 不足时右对齐:
printf("%N.Ms", str); --N 为最终的字符串输出长度
--M 为从参数字符串中取出的子串长度
5. 输出指定长度的字符串, 超长时截断, 不足时左对齐是:
printf("%-N.Ms", str); --N 为最终的字符串输出长度
--M 为从参数字符串中取出的子串长度
注意,所谓超长时截断用到的M并不是只在超长时才起作用,而是不管你有没有超长,都必须截取这么长。所以
printf("%-5.2", "123")的输出为:
12空格空格空格
只截取了2个字符,其他的用空格填补,而且左对齐。
6. 上述N,M是可以动态指定的,方法是用*代替M或者N,然后在参数列表里加上一个数字参数。例子:
printf("%-*.*s", 5,2,"123");与上面的例子效果一样。
printf("%*s", 5, "123");表示输出长度为5, 如果超长也不截断,不够的话填补,右对齐。 -
printf输出字符串_格式化字符串漏洞
2020-12-04 08:17:12# 格式化字符串漏洞## 1、什么是格式化字符串要研究格式化字符串漏洞首先我们必须得明白什么是格式化字符串。我们用c语言中常见的printf来举例```bashprintf()函数是格式化输出函数, 一般用于向标准输出设备按规定...# 格式化字符串漏洞
## 1、什么是格式化字符串
要研究格式化字符串漏洞首先我们必须得明白什么是格式化字符串。
我们用c语言中常见的printf来举例
```bash
printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出
信息。在编写程序时经常会用到此函数。函数的原型为:
`int printf(const char *format, ...)`;
函数返回值为整型。若成功则返回输出的字符数,输出出错则返回负值。
printf()函数的调用格式为:
`printf("<格式化字符串>", <参量表>);`
其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原
样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,
用来确定输出内容格式。
参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出
参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想
不到的错误。
```
看的有些模糊是吧,没关系。总的来说就是`printf`这个函数的第一个参数(第一个逗号前面的东西)就叫做格式化字符串。
它是由两部分组成:
- 格式化说明符:特点明显,“%“号开头,后面紧跟几个字符,例如:
```bash
`
%d - 十进制 - 输出十进制整数
%s - 字符串 - 从内存中读取字符串
%x - 十六进制 - 输出十六进制数
%c - 字符 - 输出字符
%p - 指针 - 指针地址
%n - 到目前为止所写的字符数
`
```
+ 普通字符串
#### 例子
我们拿个例子来说
```cpp
#include <stdio.h>
int main(void){
printf("My name is %s","BurYiA");
return 0;
}
```
在这个的**printf**中,“My name is ”就是普通字符串,而“%s”则是格式化说明符。学过c语言的应该知道,这个程序的执行结果是会打印一行
```
My name is BurYiA
```
很明显,格式化说明符将后面的参数以特定格式替换到了格式化说明符的位置
### 重点
那么问题来了,为什么我们要这么详细的说明这个东西呢。不知道大家有没有发现我上面写的一个格式化说明符“**%n**”,**它的功能是将%n之前打印出来的字符个数,赋值给一个变量**
例如:
```cpp
#include <stdio.h>
int main(void)
{
int c = 0;
printf("The number is %n", &c);
printf("%dn", c);
return 0;
}
```
你能猜一下它的结果么?
好吧,咱们不猜它,有图有真相,直接看结果

好了,暂时先说到这,其他的你们可以先自由的发挥一下想象
## 2、漏洞点
一般情况我们用**printf**是这样用的
```cpp
#include <stdio.h>
int main()
{
char arr[100];
scanf("%s", arr);
printf("%s", arr);
return 0;
}
```
可是,不知道有没有人试过这样写:
```cpp
#include <stdio.h>
int main()
{
char arr[100];
scanf("%s", arr);
printf(arr);
return 0;
}
```
这样写对不对呢?我们来运行一下试试

咳咳,有些小意外,**scanf**输入的时候遇到空格就会停止,所以后面的就没有输入进去,但……无妨,很明显的可以看到,它成功的输出了。
脑子转的快的可能已经想到了,这个时候我们就可以控制它的格式化字符串,使它变成我们想要的东西。
-
linux下printf输出字符串的颜色
2011-03-02 19:31:00linux下printf输出字符串的颜色如图:
格式:
CODE:
printf("/033[字背景颜色;字体颜色m字符串/033[0m" );
printf("/033[41;32m字体背景是红色,字是绿色/033[0m/n");
41是字背景颜色, 32是字体的颜色, 字体背景是红色,字是绿色是字符串. 后面的/033[0m是控制码.
颜色代码:
QUOTE:
字背景颜色范围: 40--49 字颜色: 30--39
40: 黑 30: 黑
41: 红 31: 红
42: 绿 32: 绿
43: 黄 33: 黄
44: 蓝 34: 蓝
45: 紫 35: 紫
46: 深绿 36: 深绿
47: 白色 37: 白色
ANSI控制码:
QUOTE:
/033[0m 关闭所有属性
/033[1m 设置高亮度
/03[4m 下划线
/033[5m 闪烁
/033[7m 反显
/033[8m 消隐
/033[30m -- /033[37m 设置前景色
/033[40m -- /033[47m 设置背景色
/033[nA 光标上移n行
/03[nB 光标下移n行
/033[nC 光标右移n行
/033[nD 光标左移n行
/033[y;xH设置光标位置
/033[2J 清屏
/033[K 清除从光标到行尾的内容
/033[s 保存光标位置
/033[u 恢复光标位置
/033[?25l 隐藏光标
/33[?25h 显示光标
这样, 在某些时候就可以实现动态的输出.参考网页:http://blog.sina.com.cn/s/blog_4c12aff701008284.html
-
printf输出字符串_c语言入门 第十二章 字符串
2020-12-06 21:59:49在c当中有一种数组是由char类型构成的,其中的元素都是字符,如果这个字符数组是以字符编码0('0'字符)结尾的,那么我们就叫这个字符数组为字符串字符串的数据常量形式是使用双引号包围的字符序列1 字符串的声明和初始化... -
关于C语言中printf输出字符串的问题!字符串须以'\0'作为结尾。
2016-07-15 14:40:07关于C语言中printf输出字符串的问题! 悬赏分:20 - 解决时间:2008-4-29 14:23 #include void main (){char a[]={'c','h','i'};char b[]={'n','a'};printf("%s%s\n",a,b);}结果是chinachi 为什么??? 提问者: ... -
printf输出字符串_Rob Pike 带你重新认识字符串、字节、rune和字符
2020-11-23 20:24:29正如派克在文中所说字符串这个话题对于一篇博客文章来说似乎太简单了,但是要很好地使用它们,不仅需要了解它们的工作原理,还需要了解字节,字符和 rune 的区别,以及 Unicode 和 UTF- 8,字符串和字符串直接量之间... -
C语言 printf输出字符串数据
2017-08-02 15:46:28void main() { unsigned char *x = "ab,sdf,sad,23432,cc"; data = x; printf("data = %c\n", *data); printf("data = %s\n", data);... system("pause");...输出结果为 data = a data = ab,sdf,sad,23432,cc -
关于printf输出字符串时宽度与精度的限制
2019-11-13 23:32:07include<stdio.h> #define BOOK "youn are very good" ... /*虽然第一个转换说明为%8s,但指定的输出宽度小于实际宽度,则按实际输出,宽度自动增加,当大于实际宽度时则左补空格*/ ... -
Linux下printf输出字符串的颜色
2014-05-29 03:39:34格式: printf("\033[字背景颜色;字体颜色m字符串\033[0m" ); -
c语言关于printf输出字符串以及scanf的一些问题
2015-11-29 08:06:27**代码一输出的第一行和第二行都是abc,代码二第一行是abc和乱码第二行是abc 请问这是为什么按说ch1没有结束符呀** 代码三 ``` scanf("%d",&x); /*此时输入一串数字并回车,变量x将正常接收到输入的整数*/ scanf... -
printf 输出字符串 需要加上 c_str()
2018-11-05 11:46:09#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; int main(){ string s = "... printf("a=%s", s.c_str()); ... -
关于printf 输出字符串的内部运行猜测
2016-12-18 13:13:40关于printf 输出字符串的内部运行猜测 最普通的一个例子。 char str [ 10 ]= "hello!" ; printf( "%s" , str ); 其中,%s是输出字符串的标志,str是一个地址。这是大家都知道的。再以下是我自己猜测的... -
Linux下Printf 输出字符串颜色控制
2012-02-27 15:42:54字体颜色m字符串\033[0m" ); printf("\033[41;32m字体背景是红色,字是绿色\033[0m\n"); 41 是 字背景颜色 32 是 字体的颜色 字体背景是红色,字是绿色 是 字符串 \033[0m 是 控制码. 颜色代码: QUOTE: ... -
Linux下 printf 输出字符串的颜色
2011-07-07 12:52:22http://my.chinaunix.net/space.php?uid=2270658&do=blog&id=333563 printf("\033[字背景颜色;字体颜色m字符串\033[0m" );printf("\033[41;32m字体背景是红色,字是绿色\033[0m -
printf输出字符串_C语言入门必学第一课,学习?输入与输出?!
2020-12-04 23:34:02数据输入 编写程序的主要目的就是为了处理数据。数据从哪里来?数据的来源有很多种方式,如从磁盘文件中读取数据、从数据库中读取...✿ gets:输入一行数据,保存到字符串变量中。✿ scanf:格式化输入函数,一次可... -
php——学习笔记,printf输出字符串格式参数
2014-07-18 14:10:10s 整数转换成字符串 u 整数转换成无符号整数 x 整数转换成小写十六进制 X 整数转换成大写十六进制 <!DOCTYPE ... -
printf输出string字符串
2018-03-22 01:04:00printf输出字符串是针对char *的,换言之,printf只能输出c语言中的内置数据,string不是c语言内置数据,否则会出现乱码。 s这个string类型的对象并非单单只有字符串,其内还有许多用于操作的函数,于是&s并非... -
C51 单片机 利用printf函数输出字符串
2014-08-19 17:37:39工程是keil2. 简单的利用C51单片机,实现了printf函数输出字符串,数字等。 找了好多资料,然后自己总结了下,实现了printf函数的应用。 有了printf函数,你就可以像VC中一样实现输出了。 -
c语言printf打印字符串颜色
2017-02-28 17:38:42Linux下printf输出字符串的颜色 基本打印格式: printf("\033[字背景颜色;字体颜色m字符串\033[0m" ); printf("\033[41;32m字体背景是红色,字是绿色\033[0m\n"); 41是字背景颜色, 32是字体的颜色, 字体背景... -
printf()输出字符串
2020-04-11 20:29:49printf函数输出一个字符串的时候,用格式符%s控制,相应的另一个参数可以是字符串的一个地址,注意是地址,这样也可以输出字符串。 -
C printf 格式输出字符串
2013-01-23 08:36:57s格式符:用来输出一个字符串。 %s 用来输出一个字符串,不含双引号. 例:printf("%s","CHINA"); %ms m指定宽度(字符串长度小于m时左补空格,大于时按实际宽度输出) %-ms 左对齐,不足m时右补空格 %m.... -
C语言中如何使用printf输出string类型字符串
2018-11-18 11:07:461.printf函数输出字符串是针对char *的,即printf只能输出c语言的内置数据类型,而string不是c语言的内置数据类型。 2.string类型的对象不止包含字符串,还包含了许多用于操作的函数,所以&str并非字符串的首... -
C函数 printf 拼接字符串
2020-07-16 09:26:39C函数 printf 拼接字符串 从前学C语言,最常用的函数可能就是 printf 了,但是往往是这样: printf(年龄是:"%d",a); 由于不懂得怎么拼接字符串,有时候只能用两个printf 语句,很难受。 使用多个双引号 printf... -
使用printf输出string类型字符串
2020-11-12 13:11:09使用 printf 输出 string 类型的字符串,错误示例: #include<stdio.h> #include<iostream> using namespace std; string s; int main() { string a = "I am a idiot."; printf("%s",a); return 0; ...