c++接收问题为何cin能接收,scanf接收就出错?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++接收问题为何cin能接收,scanf接收就出错?相关的知识,希望对你有一定的参考价值。
name[i].c_str()返回的存储区是只读的,你要scanf字符串给它,肯定报错了。前缀c_就是这个意思。追问还是不太明白。
追答const char *c_str()const;//返回一个以null终止的c字符串
上面是函数的原型。后面的const看到了吧,返回的那个const指针是不能更改所指同的内容的。也就是不能写入数据。
所有 都不推荐在C++里混入C的特别是这种输入输出函数。因为,关于输入输出缓冲区两种语言的混合也是令人头痛的问题。
还是统一风格吧。
char str[256]; scanf("%s",str); name[i]=str;
而使用name[i].c_str()一般用于输出或读取,不用于修改字符串内容,它返回的是一个常量字符串指针,是只读的。 参考技术B scanf()是C里面的,而C是没有string这个概念的
让scanf()接收空格
大家都知道scanf()遇到空格后就会结束 原因是底层函数是这么返回给你的
调用scanf()时 那现在从底层把他截获
源码://vs2015
#include <windows.h>
#include<iostream>
using namespace std;
_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);
#ifdef __cplusplus
extern "C"
#endif
FILE* __cdecl __iob_func(unsigned i) {
return __acrt_iob_func(i);
}
// 全局变量
char g_szId[120] = { " i love this game\n\n" };
#pragma comment(lib,"user32.lib")
int main()
{
// 局部变量
char szBuf[120];
printf("please input password: ");
scanf_s("%s", szBuf, 120);
char* p = *(char**)((int)__iob_func(0) + 4); //取缓冲区中的值 __iob_func(0)输入
//__iob_func(1)输出 __iob_func(2)错误
printf("%s\n", szBuf);
printf("%s", p);
if (strcmp(p, g_szId) == 0)
{
printf("It‘s Right\n");
}
else
{
printf("It‘s Err \n");
}
system("pause");
return 0;
}
//vc6.0版
//#include "stdio.h"
//#include <windows.h>
//// 全局变量
//char g_szId[120] = { " i love this game\n\n" };
//#pragma comment(lib,"user32.lib")
//
//int _tmain(int argc, _TCHAR* argv[])
//{
// // 局部变量
// char szBuf[120];
// printf("please input password: ");
// scanf_s("%s", szBuf, 120);
//
// char* p = *(char**)((int)__iob_func() + 8);
// if (strcmp(p, g_szId) == 0)
// {
// printf("It‘s Right \n");
// }
// else
// {
// printf("It‘s Err \n");
// }
// system("pause");
//
// return 0;
//}
为什么打那么多呢 其时底层不管你打什么它都保存在那
用途:
优化下可以作为登录密码(我本来就是逆出来的)
以上是关于c++接收问题为何cin能接收,scanf接收就出错?的主要内容,如果未能解决你的问题,请参考以下文章
c++中 cincin.get()cin.getline()cin.getchar()的区别