zoukankan      html  css  js  c++  java
  • C++中数字与字符串之间的转换 scanf string总结(复习必读)

       1 string的scanf读入操作

    C++里面控制台输入直接使用cin操作就可以了;或者getline(istringstream,string);

    字符和数字加减就是字符的ASCII码和数字直接加减。

    只有内置类型int,float,char,double,bool可以直接赋值,scanf读入string不能直接使用scanf直接赋值,因为string是一个类class,有专门的初始化函数,不能使用scanf,同理gets接收的也是一个char指针。编程语言自带的sizeof也是一样,不能对string进行直接操作。

    string s;
    s.resize(100);
    scanf("%s",&s[0]);

    或者:

    string s;
    char *c = new char(100);
    scanf("%s",c);//scanf("%s",&c[0]);
    s = c;//给首地址

    strlen是得到输入的有效字符串,而不是开辟的空间大小100.

    strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符''为止,然后返回计数器值。--就是指实际字符串或字符数组的实际长度(不是所占空间的字节数)。

    char A[6]={'a','b','','d','e','r'}; 
    int i=strlen(A);          //i为2,因为到’’结束,故实际A[]只有2个元素 
    sizeof()
    string s;
    char *c = new char(100);
    scanf("%s",c);
    int len  = strlen(c);
    s1.resize(len);//动态编译
    s1.assign(c,c + len);//copy(c,c + len,s1.begin());针对其他结构 
    class X 
      
      int i; 
      int j; 
      char k; 
      }; 
      X x; 
    cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐 
    cout<<sizeof(x)<<endl; 结果 12 同上 
    解释一下,在class X中,成员中最大的所占的空间为int类型所占的空间4个字节,故内存补齐,最后结果为: ((int)(实际成员所占内存空间的和/4)+1)*4

    *所以不能通过sizeof(string) / sizeof(string[0])得到实际char元素个数,不管string等于多少,最后的结果都是28;因为string是一个class。

    copy()用法:

    此算法接收三个迭代器iterator,前两个表示一个输入范围,第三个表示目的序列的起始位置。

    char 和int 的转换:

    int = char - '0';

    char = int + '0';

    2 C++中数字与字符串之间的转换(important)

     1、字符串数字之间的转换

    (1)string --> char *
       string str("OK");
       const char * p = str.c_str();

    (2)char * -->string
       char *p = "OK";
       string str(p); 
    (3)string->double
      double d=atof(s.c_str());

    常用函数atoi(),itoa(),to_string();


    2、数字转字符串:使用sprintf()函数

    char str[10];
    int a=1234321;
    sprintf(str,"%d",a);
    --------------------
    char str[10];
    double a=123.321;
    sprintf(str,"%.3lf",a);
    --------------------
    char str[10];
    int a=175;
    sprintf(str,"%x",a);//10进制转换成16进制,如果输出大写的字母是sprintf(str,"%X",a)
    --------------------
    char *itoa(int value, char* string, int radix); 
    同样也可以将数字转字符串,不过itoa()这个函数是平台相关的(不是标准里的),故在这里不推荐使用这个函数。

    3、字符串转数字:使用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().

    4、使用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 string类的所有函数操作总结

    1、初始化string

    string s = "1234";
    string s("1234");
    string s(n,'c');
    string s(s1,pos2);//s是s2从下标pos2开始的字符的拷贝
    string s(s1,pos2,len2);//s是s2从下标pos2开始len2个字符的拷贝

    2、string基本操作

    2.1 输入:以回车或者空格分开,或者文件末尾EOF;

    cin >> s;
    getline(cin,s); 
    getline(istringstream,s);

    2.2 c风格的string函数(下面的必须以''结尾的字符串)

    strlen(p);     //返回p的长度,不包含结尾‘’
    strcmp(p1,p2); //p1 == p1 -> 返回0,p1 > p2 -> 返回正值,p1 < p2返回负值
    strcat(p1,p2); // p1 + p2
    strcpy(p1,p2);//p2拷贝给p1;

    string s = "123";

    const char *p = s.c_str();

    3、 string作为顺序容器的操作

    //子字符串的操作:
    s.substr(pos,n) ;//返回s中从pos开始的n个字符的子字符串
    s.erase(pos,len);//删除从pos开始的len个字符,len不写的话删除pos 开始的所有字符
    s.insert(pos,args);从pos位置插入args
    s.assign(args);//将s中的字符替换为args中的字符
    s.append(args);
    s.replace(range,args);//删除range中的元素,替换为args中的元素
    //args具体看primer P323

    string的搜索操作:

    s.find(args);
    s.rfind(args);
    s.find_first_of(args);
    s.find_last_of(args);
    s.find_first_not_of(args);
    s.find_last_not_of(args);

     每个操作接收一个可选的第二参数,可以用来指定从什么位置开始搜索。例如args = c,pos,代表从pos位置开始搜索c,其中pos参数是可以省略的。

    如果搜索失败,则返回一个string::npos的static的成员。

    s.find_first_of(args);在s中查找args中任何一个字符第一次出现的位置。

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    int main() {
        string target("ad2c3d7r4e6");
        string numbers("0123456789");
        string num, alpha;
        unsigned int pos = 0;    
        while ( (pos = target.find_first_of(numbers,pos)) != string::npos) {
            num.push_back(target[pos]);
            ++pos;
        }
        pos = 0;
        while ( (pos = target.find_first_not_of(numbers, pos)) != string::npos) {
            alpha.push_back(target[pos]);
            ++pos;
        }
        cout << "numbers is :
     " << num << endl;
        cout << "alpha is :
     " << alpha << endl;
        system("pause");
        return 0;
    
    }
    void findLongestWord() {    
        ifstream in("input.txt");
        string res,tmp,source;
        string target("bdfghjklqpy");
        unsigned int pos = 0;
        int maxLen = 0;
        int resPos = 0;
        while (getline(in, tmp)) {
            istringstream ss(tmp);
            while (ss >> source) {
                if (pos = source.find_first_of(target, pos) != string::npos) {
                    continue;
                }
                if (source.size() > maxLen) {
                    maxLen = source.size();
                    res = source;
                }
            }
        }
        cout << res << endl;
    
    }

     compare函数:

    根据s是等于、大于、小于参数指定的字符串,s.compare返回0,整数或负数。

    数值转换:

    int i = 42;

    string s = to_string(i);

    int  i = stoi(s);//string转换为int值。

  • 相关阅读:
    k8s存储(部署理论)
    DELL R720针对磁盘故障面板信息误报解决
    ovirt平台新建kvm操作
    宿主机计划任务执行docker相关命令
    网企-11-12
    洛谷-P1164 小A点菜
    洛谷-P1060 开心的金明
    洛谷-P1305 新二叉树
    洛谷-P1030 求先序排列
    洛谷-P1087 FBI树
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/7678477.html
Copyright © 2011-2022 走看看