数据大搜索
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变量的优势是不需要考虑去变量是否被释放,比较安全。
二:new:new是用来在堆上申请内存地址的关键字,他产生的变量不会自动释放,除非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