• 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]='';
        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]='';
    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 }
  • 相关阅读:
    家谱树 x
    codevs 1231 最优布线问题 x(find函数要从娃娃抓起系列)
    洛谷 P1546 最短网络 Agri-Net x
    codevs 5969 [AK]刻录光盘x
    家谱(gen)x
    [POJ2594]Treasure Exploration(最小路径覆盖变种,floyd算法,匈牙利算法)
    [HDOJ5855]Less Time, More profit(最大权闭合子图,二分,最大流)
    [HDOJ1054]Strategic Game(最小点覆盖,最大二分匹配,HK算法)
    [HDOJ3829]Cat VS Dog(最大独立集)
    [HDOJ3488]Tour(二分图最小匹配,KM算法)
  • 原文地址:https://www.cnblogs.com/ohyee/p/5194919.html
Copyright © 2020-2023  润新知