Uva 10815.Andy's First Dictionary
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva 10815.Andy's First Dictionary相关的知识,希望对你有一定的参考价值。
题意和思路都非常非常明确,直接读入->set->输出
然而,在读入上竟然出了问题
最早是是用的
string temp; scanf("%s",temp); printf("%s",temp);
这种写法,但是编译器报错,提示
error: cannot pass objects of non-trivially-copyable type ‘std::string {aka class std::basic_string<char>}‘ through ‘...‘
scanf("%s",s);
查了一下,是因为string类本身长度是不定的,在没有给他赋值上字符串前,是没意义的,而scanf需要一个地址来存储,所以直接读入是很有可能出现问题的。
而输出的时候,则由于c、c++不同的特性,需要用temp.c_str()
本来想换成cin读入,但是因为不关闭同步会很慢,就查了下怎么能读入更快,看到用 getchar() 更快,想了下,就自己写吧
里面顺便把大小写也转化了下
int read(char s[]){ char c; int i=0; while(!(((c=getchar())>=‘A‘&&c<=‘Z‘)||(c>=‘a‘&&c<=‘z‘))) if(c==EOF) return 0; while((c>=‘A‘&&c<=‘Z‘)||(c>=‘a‘&&c<=‘z‘)){ s[i++]=(c>=‘A‘&&c<=‘Z‘?c-‘A‘+‘a‘:c); c=getchar(); } s[i]=‘\0‘; return i; }
另外,在之前用string通过 for(int i=0;i<str.size();i++) 时,又出现了
omparison between signed and unsigned integer expressions [-Wsign-compare]
这个查了下是因为 str.size() 返回的是无符号整数,而i是有符号整数,所以两个直接比有可能会出现问题。
所以有了 for(size_t i=0;i<str.size();i++) 这种写法,其中 size_t 是std命名空间里的,他可以兼容不同的运行环境,保证与返回的size能够兼容
明明一个很简单的题,牵扯出来一群乱七八糟的问题,不过总算学了好多
1 #include <cstdio> 2 #include <set> 3 #include <string> 4 #include <cstring> 5 #include <iostream> 6 using namespace std; 7 8 int read(char s[]){ 9 char c; 10 int i=0; 11 while(!(((c=getchar())>=‘A‘&&c<=‘Z‘)||(c>=‘a‘&&c<=‘z‘))) 12 if(c==EOF) 13 return 0; 14 while((c>=‘A‘&&c<=‘Z‘)||(c>=‘a‘&&c<=‘z‘)){ 15 s[i++]=(c>=‘A‘&&c<=‘Z‘?c-‘A‘+‘a‘:c); 16 c=getchar(); 17 } 18 s[i]=‘\0‘; 19 return i; 20 } 21 22 int main(){ 23 //freopen("in.txt","r",stdin); 24 set<string> s; 25 set<string>::iterator it; 26 char str[100]; 27 while(read(str)) 28 s.insert(str); 29 30 for(it=s.begin();it!=s.end();it++) 31 cout<<*it<<endl; 32 33 return 0; 34 }
以上是关于Uva 10815.Andy's First Dictionary的主要内容,如果未能解决你的问题,请参考以下文章
Uva 10815.Andy's First Dictionary
UVA - 10815 Andy's First Dictionary
UVa10815 Andy's First Dictionary (STL)
uva 10815,andy's first ditionary(set,stringstream的简单运用)