数据大搜索 (水题)(auto存储类型标识符 学习)

数据大搜索
Time Limit: 1000 MS Memory Limit: 64 MB

写一个程序,把一个字符串中的数字子序列找出来并转换成十进制整数输出。

Input
第一行是整数n,表示测试的数据组数,下面是n行无空格的字符串(长度不超过200)。题目保证字符串中含的整数位数小于9位,不考虑负数情形。

Output
每一行输入对应一行输出,一行中若有多个数据,每个数据后有一个空格。

Sample input and output
Sample Input Sample Output
1
00tUrA-Hc:T#7yN;J0123Y+'-rD%\SV{)e’9;Lt[^$}~0
0 7 123 9 0
Source
wxiaoping C语言上机实验

AC代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+100;
int main(){
 ios::sync_with_stdio(0);
 string s;
 int T;
 cin >> T;
 while(T--){
    cin >> s;
    int sum = 0;
    int flag = 0;
    for(auto v:s){
        if(v >= '0' && v <= '9'){
            flag = 1;
            sum *= 10;
            sum += v - '0';
        }
        else{
            if(flag == 1)cout<<sum<<" ";
            sum = 0;
            flag = 0;
        }
    }
    if(flag!=0)cout<<sum;
    cout<<endl;
 }
 return 0;
}

一、解析:
C++11标准是把auto自动变量的含义给去掉了,现在是自动类型推断
c++ prime中
如果要更改字符串中的字符值,我们必须将循环变量定义为引用类型(第2.3.1节,第50页)。请记住,引用只是给定对象的另一个名称。当我们使用引用作为我们的控制变量时,该变量依次绑定到序列中的每个元素。使用引用,我们可以更改引用所绑定的字符

下一个代码片转自 for(auto &c:s)与for(auto c:s)

// 在c11标准下可以执行的特殊格式的for循环语句,区别在于引用类型可以改变原来的值
#include<iostream>
using namespace std;
int main()
{
    string s("hello world");
    for(auto c:s)
    c='t';
    cout<<s<<endl;//结果为hello world
    for(auto &c:s)
    c='t';
    cout<<s<<endl; //结果为ttttttttttt

以上解析转自
C++11 auto类型说明符如for(atuo &x : s)

二、auto 及相关变量类型学习 我所粘贴以下内容的出处

代码1:
#include<iostream>
#include<string>
using namespace std;
string s = "hello";
for (auto &i : s ) //i是个引用 i到底引用的是什么?
i = toupper(i); //改变成大写,影响s的值
cout<<s<<endl; //s的值是 HELLO

代码2:

#include<iostream>
#include<string>
using namespace std;
string s = "hello";
for (auto i : s ) //书上说i 是char类型,那s[n]呢?
i = toupper(i); //改变成大写,不影响s的值
cout<<s<<endl; //s的值是 hello

一:auto:用来声明自动变量。它是存储类型标识符,表明变量(自动)具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。其实大多普通声明方式声明的变量都是auto变量,他们不需要明确指定auto关键字,默认就是auto的了。auto变量在离开作用域是会变程序自动释放,不会发生内存溢出情况(除了包含指针的类)。使用auto变量的优势是不需要考虑去变量是否被释放,比较安全。

二:newnew是用来在堆上申请内存地址的关键字,他产生的变量不会自动释放,除非delete来手动释放,或者程序结束时由操作系统释放,使用new的优势是内存使用比较灵活,理论可以申请任意大小的内存区块(实际与操作系统有关),但这很容易产生问题,一不小心忘记释放对象,特别是在频繁调用的函数内创建的对象忘记释放时,会产生内存溢出,严重时导致程序出错,系统崩溃。new一般都是在类的定义中使用,结合delete可以使包含new出来对象的类也具有自带变量功能,这样就继承了两种方式的优势。

三:另外一个题外话:auto的对应类型不是使用new出来的变量,也不是static变量
static变量是程序结束的时候才释放对象的,但它不需要手动释放。
static如果在一个函数内申明,这每次进入这个函数时,还是使用第一次声明的变量,并且还保存的上次使用的值。
static变量如果在结构和类中使用,这结构或类定义的一切对象,都将共享唯一static变量。
auto变量在函数结束时即释放了,再次调用这个函数时,又重新定义了一个新的变量。

三、附加:自己霞做的,真的又复杂又冗余 还 wa 了
我居然用队列做的 哎, 我都觉得写的复杂,但是收藏一下吧,虽然错了
找不出自己错在哪的复杂代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <queue>

using namespace std;
int main()
{
    queue <int> q;
    int i, t;
    char s[210];
    scanf("%d",&t);
    while(t--)
    {
        gets(s);
        int len = strlen(s);
        for(i = 0; i <= len; i++)
        {
            if(s[i] >= '0' && s[i] <= '9')
            {
                q.push(s[i] - '0');
            }
            else
            {
                if(q.front() == 0)
              {
                while(!q.empty())
                {
                    if(q.front() == 0)
                    {
                        if(q.size() == 1){
                        printf("%d ",q.front());
                        q.pop();
                        break;
                        }
                        else
                        {
                            q.pop();
                        }
                    }
                    else
                    {
                        while(!q.empty())
                        {

                            printf("%d",q.front());
                            q.pop();
                            if(q.size() == 0)
                                printf(" ");
                        }
                    }
                }
                }
                else
                {
                    while(!q.empty())
                        {
                            printf("%d",q.front());
                            q.pop();
                            if(q.size() == 0)
                                printf(" ");
                        }
                }
            }
        }
        printf("\n");
    }
    return 0;
}

、 本题目 通常 做法与第一个代码本质相同 只是 后者c++ 格式 写的快捷
从串里找出所有的数 并按照一定格式输出。
主要用sum+=s[i]-‘0’; sum*=10;, 一类的语句来存取;
还有 其他写的方式

 int i,sum=0;
        for(i=0; i<len; i++) // 一次循环 两次if判定
        {
            if(s[i]>='0'&&s[i]<='9')
            {
                sum+=s[i]-'0';
                if(s[i+1]>='0'&&s[i+1]<='9')
                {
                    sum*=10;
                }
                else
                {
                    printf("%d ",sum);
                    sum=0;// 记得 归零
                }
            }
        }
        printf("\n");

还有队友用字符作输出的, 很好

 char s[210], c[210];
    cin >> t;
    while(t--){
        memset(c, '\0', sizeof(c));
        memset(s, '\0', sizeof(s));
        cin >> s;
        int l, t, f;
        l = strlen(s);
        t = 0;
        f = 0;
        for(int i = 0; i < l + 1; i++){
            if(s[i] >= '0' && s[i] <= '9'){
                c[t++] = s[i];
                f = 1;
            }
            else{
                if(f){
                    int j;
                    for(j = 0; j < t; j++){
                        if(c[j] != '0')   break;
                    }
                    if(j >= t) cout << "0";
                    else{
                        for(; j < t; j++)   cout << c[j] - '0';
                    }
                    cout << " ";
                    memset(c, '\0', sizeof(c));
                    t = 0;
                    f = 0;
                }
            }
        }
        cout << endl;
    }
    return 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值