c\c++中的数据输入

因为从流中读入数据保存到string中,string会遇到空格就停止录入(这是我很久都未解决的问题,今天终于解决了,真的巨开心)。这样当我们输入一行带空格的字符串,就要考虑getline函数,从流中读入一行字符串。

1.以下是输入3行的示例。

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str[3];
	for(int j=0;j<3;j++){		
	    getline(cin, str[j]);	    
	}
}

2 包含其他输入后读入多行字符串

  例如一些编程题要求先输入字符串行数,然后再一行一行读入字符串。如果正常顺写编程的话,会发现第一行字符串读入的是空,后续才能正常录入每行字符串。 
  这是因为第一行输入一个int数据后,换行符并没有被忽略,直接被准备读入第一行字符串的getline俘获。
  所以需要在第一行输入一个int数据后,调用cin.ignore()忽略下面的一个流录入,将其抛弃。

#include<iostream>
using namespace std;
int main(){
    int N;
    cin>>N;
    cin.ignore();  //取消换行键的读入
    string strCinLine[100];
    for(int i =0;i<N;i++)
        getline(cin,strCinLine[i]);
}   
 
或者给strCinLine动态申请空间,节省空间开销。

#include<iostream>
using namespace std;
int main(){
    int N;
    cin>>N;
    cin.ignore();  //取消换行键的读入
    string* strCinLine = new string[N];
    for(int i =0;i<N;i++)
        getline(cin,strCinLine[i]);
    delete []strCinLine; //记得释放动态空间
    strCinLine = NULL;
} 


当读入完数据之后,有时还需要将其按空格分割。

1.如果是字符串,则只需分割即可。则可用如下代码。

#include <iostream>
#include <sstream>
#include <vector> 
using namespace std; 
int main() {
    string str = "hello world sperated by   spaces\tand\nhuiche"; 
    vector<string> arr;
    istringstream ss(str);
    string word;
    while(ss>>word) {
        arr.push_back(word);
    } 
    for(size_t i=0; i<arr.size(); i++) {
        cout << arr[i] << endl;
    }     
    return 0;
}
2.如果是一串数字的话,则需现将其按空格分开,再将每个分开的字符串化为数字,具体做法如下:(有的编译器可能通不过)

1)字符串转数字:使用sscanf()函数

char str[]="1234321";

int a;

sscanf(str,"%d",&a);
.............
char str[]="123.321";
double a;
sscanf(str,"%lf",&a);
.............
char str[]="AF";
int a;
sscanf(str,"%x",&a); //16进制转换成10进制
另外也可以使用atoi(),atol(),atof().

(2)使用stringstream类

用ostringstream对象写一个字符串,类似于sprintf() 
  ostringstream s1;
  int i = 22;
  s1 << "Hello " << i << endl;
  string s2 = s1.str();
  cout << s2;

用istringstream对象读一个字符串,类似于sscanf() 
  istringstream stream1;
  string string1 = "25";
  stream1.str(string1);
  int i;
  stream1 >> i;
  cout << i << endl;  // displays 25

(3)C++可以通过 atoi函数把字符转换成数字。

#include <stdlib.h>
#include <stdio.h>  
int main(void)
{
    int n;
    char *str = "12345";
    n = atoi(str);
    printf("int=%d\n",n);
    return 0;
}

附: 

C++从屏幕输入一行以空格分割的数字,存入整型数组(数字个数未知)

方法一:
#include<iostream>
using namespace std;
int main()
{
    int a[50];
    int i = 0;
    char c;
    while((c=getchar())!='\n')
    {
        if(c!=' ')//把这句判断条件改动
        {
            ungetc(c,stdin);
            cin>>a[i++];
        }
    }
    for(int j=0;j<i;j++)
    {
        cout<<"a["<<j<<"]:"<<a[j]<<endl;
    }
}
方法二:
#include<iostream>
using namespace std;
int main()
{
    int a[20];
    int i = 0;
    char c;
    cin>>a[i++];
    while((c=getchar())!='\n')
    {
        cin>>a[i++];
    }
    for(int j=0;j<i;j++)
    {
        cout<<"a["<<j<<"]:"<<a[j]<<endl;
    }
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值