在C和C++中,用普通的方法输入带空格的字符串时,得不到后续的数据。想要在字符串中包含空格可以使用以下方法:

(1)使用正则表达式

scanf("%[^\n]]",str);        //接收带空格的字符串
scanf("%[a-z A-Z 0-9]",str)  //表示只匹配输入是大小写字母和数字。

(2)在C中使用gets();或fgets();

在Linux下使用gets()会出现如下警告,因为Linux下gcc编译器不支持这个函数,解决办法是使用fgets()。

fgets()函数的用法:

fgets(char *s, int size, FILE *stream);#include <stdio.h>int main()
{char a[20];char b[20];char c;scanf("%[^\n]]", a);printf("%s\n", a); c = getchar();fgets(b, 20, stdin);fputs(b, stdout);return 0;
}

(3)在C++中使用getline(cin, string str);(该函数需要包含#include <string>)

(4)在C++中使用cin.getline(char *str, int number);(字符串的长度为number-1)

(5)在C++中使用cin.get();

#include <iostream>
#include <string>
using namespace std;int main()
{string s1,str = "Asd123";char p[40];cin.getline(p, 20);cout << "[1]:" << p <<endl;getline(cin, s1);cout << "[2]:" << s1 <<endl;cin.get(p, 40);cout << "[3]:" << p <<endl;return 0;
}

在C++中要将string转化为char*或const char*可以用以下方法:

①强转(只适用于以下形式)

char *p = (char*)"Asd";

②const char *c_str();

string str = "Asd";
const char *p = str.c_str();
注意c_str函数的返回值是const char*

③data();

string str = "Asd";
const char *p = str.data();
data()与c_str()类似,但是返回的数组不以空字符终止。

④copy(p, len, start);

string s1 = "asdqwezxc";
char p[20];
s1.copy(p, 5, 0);
*(p+5) = '\n';

综合实例:

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;int main()
{char *p1 = (char*)"Asd";const char *p2;char a[20];const string s1 = "Asd123";printf("[1]:%s\n", p1);p2 = s1.c_str();printf("[2]:%s\n", p2);p2 = s1.data();printf("[3]:%s\n", p2);s1.copy(a, 5, 0);*(a+5) = '\0';cout << "[4]:" << a;return 0;
}

c_str()函数返回一个指向C字符串的指针,内容与本string串相同。这是为了与C语言兼容,因为在C语言中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成C中的字符串样式。

注意:使用c_str()带来的小问题

const char* c[];
std::string s = "1234";
c = s.c_str();
std::cout << c << std::endl; //输出:1234
s = "abcd";
std::cout << c << std::endl; //输出:abcd  

解决的办法

char* c = new char;
std::string s = "1234";
//char *strcpy(char* dest, const char *src);
strcpy(c, s.c_str());
std::cout << c << std::endl; //输出:1234
s = "abcd";
std::cout << c << std::endl; //输出:1234  

顺便提一下,const_cast用于取出const属性,把const类型的指针变为非const类型的指针,如下:

const int *fun(int x, int y){}
int *p = const_cast<int*>(fun(1,2));

将const char*转化为char*示例:

#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;int main()
{string str = "Asd";const char *p = str.data();char *q = const_cast<char*>(p);printf("%s\n", q);return 0;
}

获取string长度的方法:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>using namespace std;
int main()
{const char *p2;string str = "String Asd";cout << "str.length():" <<str.length() << endl;cout << "str.size():" <<str.size() << endl;p2 = str.c_str();printf("strlen:%d\n", strlen(p2));return 0;
}

C/C++中输入带空格的字符串 string 转 char*相关推荐

  1. c语言中字符串中输入空格,C语言输入带空格的字符串

    因为: scanf("%s",str); 遇到空格就停止接收后面的字符. scanf("%s", str, 10); 不能接收带空格的字符串输入,虽然它的指定长 ...

  2. C++中判断在字符串中是否存在空格 以及 如何输入带空格的字符串

    1:引言: 输入带空格的字符串 需要用到 getline(cin,str);具体在代码中看 2:上码 #include<bits/stdc++.h> using namespace std ...

  3. 洛谷 P1598 垂直柱状图(输入带空格的字符串)

    P1598 垂直柱状图 菜鸟生成记(25) 这个题有点水,考察字符串的基本功(哎!就喜欢这考基本功的水题) 这一题涉及到输入带空格的字符串输入和格式化输出; 唉!只从gets死了(C11删除gets, ...

  4. java控制台输入带空格的字符串

                                                   java控制台输入带空格的字符串 Scanner sc = new Scanner(System.in); ...

  5. Scanner输入带空格的字符串

    Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,它判断读取结束的标示是  空白符:比如空格,回车,tab 等等. next()方法读取到空白符就结束: nextLine()读取 ...

  6. 大坑:c++如何输入带空格的字符串?

    在读这篇文章之前,先来记住两点: 空字符'\0',它在内存中占一个字符,但不会影响字符串的长度,就是说我们用strlen()和size()函数返回字符串或字符数组长度的时候是不算空字符的. 输入回车是 ...

  7. C/C++中带空格的字符串的输入

    问题一:带空格的字符串输入(c++) 对于字符数组 方法一:getline() 读入整行数据,使用回车键输入的换行符来确定输入结尾. 调用方法: cin.getline(str, len) 第一个参数 ...

  8. c++如何输入带空格的字符串

    1.scanf函数(包含头文件#include <stdio.h>) scanf函数一般格式为scanf("%s",st),但scanf默认回车和空格是输入不同组之间的 ...

  9. C++中字符数组和字符串string

    字符数组 C++中字符数组用char str[]能够用来表示一个字符串. (1)   数组的大小和字符串的长度. 数组的大小一定要大于字符串的长度,由于系统会自己主动补上一个'\0'作为字符串的结束标 ...

最新文章

  1. Tensorflow 变量的共享
  2. java学习笔记(八)----包,jar文件
  3. MapReduce 详解
  4. Go Concurrency Patterns: Timing out, moving on
  5. LeetCode-652. 寻找重复的子树
  6. unity, 不要用TextMesh,用图片代替
  7. 使用BI软件的好处有哪些
  8. 我所期待的易语言2007
  9. ThinkPHP空操作及命名空间
  10. Python抖音视频去水印,并打包成exe可执行文件
  11. Bluetooth HCI
  12. Java-微信授权and手机号授权
  13. wordpress启动_使用Wumblr在WordPress中启动微博
  14. php 5.0入门系列教程 pdf,thinkphp5.0基础视频教程
  15. 今天上班了,周末跟随公司组织的旅游去了四川省南充市阆中市参观了张飞庙了解了一下“张飞身葬阆中,头葬云阳”的故事。...
  16. Echarts制作横向坐标轴,并且文字名称和数值都在横向坐标轴的上面
  17. CSS实现a标签去掉下划线以及点击不再有颜色变化
  18. 中南大学综合选拔2019计算机,中南大学计算机学院2019年硕士研究生复试情况汇总表...
  19. 使用top做sql分页
  20. 中国电信开启移动互联网“全”时代

热门文章

  1. ADO学习(七)ADOX相关知识
  2. API---有意思的API
  3. Python中的shuffle()函数的使用
  4. 强烈推荐|我做系统架构的一些原则
  5. 一文详解 Prometheus 的高可用方案:Thanos
  6. 谈谈前后端分离实践中如何提升RESTful API开发效率
  7. 字节、阿里等大厂的技术如何?看看这些Java程序员的自学笔记
  8. 音视频技术开发周刊 | 192
  9. 腾讯游戏应邀2019大数据产业峰会BDIC | 荣获“大数据星河奖”并获颁测评证书...
  10. 腾讯安全平台部专家研究员胡育辉:千亿黑产背后的破局之道