• acm2072 很简单


    #include<stdio.h>

    int main(void)
    {
    int word=0,flag=0;
    char c;
    while((c=getchar())!='#')
    {
    if(((c<='z'&&c>='a')||(c<='Z'&&c>='A')))
    flag=1;
    if(c==' '&&flag)//在前面出现字母的前提下 出现空格才算一个单词
    {
    word++;
    flag=0;
    }

    if(c==' ')//考虑中途换行 最后一个都计算不到了

    word++;

    }
    printf("%d",word+1);
    return 0;
    }

            打完后 我去看了下别人的代码 发现比这都复杂 且都或多或少定义了很大的数组 我做题重来讲究思路对就行 重来没有真正放到acm网站上去测试过 不知道 此题有没有错  至少我认为的几种可能导致错误的情况我都排除了 如多个空格 句子前面有空格 中途换行啊 等等。

            仔细看我别人的程序 再去看原题 发现原来题目看错了 目的是查找一行中不同单词的个数 这样看来定义数组是必要的了  转载一段代码:

    1. #include <stdio.h>  
    2. #include <string.h>  
    3.   
    4. char word[100000];  
    5. char arr[100][100];     //arr用于存储以前出现过的单词  
    6.   
    7. int main(void)  
    8. {  
    9.     int len, pos, count;  
    10.     char temp[100];  
    11.     while(gets(word) && strcmp(word, "#") != 0)  
    12.     {  
    13.         len = strlen(word);  
    14.         pos = 0;  
    15.         count = 0;  
    16.         // pos加单词长度一直到>=len  
    17.         while(pos < len)  
    18.         {  
    19.             sscanf(word + pos, "%s", temp); //把一个单词存入temp,空格忽略  
    20.             int i;  
    21.             for(i = 0; i < count; i ++)  
    22.                 if(strcmp(arr[i], temp) == 0)//如果和以前存入的单词相同,则不计数  
    23.                     break;  
    24.             if(i == count)  
    25.                 strcpy(arr[count++], temp); //把temp存入arr,并计数器cnt加一  
    26.             /*用pos来记录下次读取的位置*/  
    27.             for(i = pos; word[i] == ' '; i++)   //空格  
    28.                 pos++;  
    29.             pos += strlen(temp) + 1;    //单词  
    30.         }  
    31.         //判断是否全为空格  
    32.         int k, m = 0;  
    33.         for(k = 0; k < len; k ++)  
    34.             if(word[k] == ' ')  
    35.                 m ++;  
    36.         if(m == len)  
    37.             printf("0 ");  
    38.         else  
    39.             printf("%d ", count);  
    40.     }  
    41.     return 0;  
    42. }  

         此程序让我又多认识了一个新函数,从字符串中读取指定格式的数据的函数。

        转载百度一段知识:

    char buf[512];
    sscanf("123456","%s",buf);//此处buf是数组名,它的意思是将123456以%s的形式存入buf中!
    printf("%s ",buf);
    结果为:123456
    2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
    1
    2
    sscanf("123456","%4s",buf);
    printf("%s ",buf);
    结果为:1234
    3. 取到指定字符为止的字符串。如在下例中,取遇到任意小写字母为止的字符串。
    1
    2
    sscanf("123456abcdedf","%[^a-z]",buf);
    printf("%s ",buf);
    结果为:123456
    4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
    1
    2
    sscanf("123456abcdedfBCDEF","%[1-9a-z]",buf);
    printf("%s ",buf);
    结果为:123456abcdedf
    当输入:  sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
    1
    printf("%s ",buf);
    结果为:123456
    5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
    1
    2
    sscanf("123456abcdedfBCDEF","%[^A-Z]",buf);
    printf("%s ",buf);
    结果为:123456abcdedf
    6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,
    先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
    1
    2
    sscanf("iios/12DDWDFF@122","%*[^/]/%[^@]",buf);
    printf("%s ",buf);
    结果为:12DDWDFF
    7、给定一个字符串“hello, world”,仅保留world。
    (注意:“,”之后有一空格,%s遇空格停止,加*则是忽略第一个读到的字符串)//也是遇空格停止的
    1
    2
    sscanf(“hello,world”,"%*s%s",buf);
    printf("%s ",buf);
    结果为:world
    %*s表示第一个匹配到的%s被过滤掉,即“hello,”被过滤了
    如果没有空格则结果为NULL。
     
    此程序中的sscanf(word + pos, "%s", temp)很常用 我就总遇到想对一个字符串多次读取的情形
  • 相关阅读:
    3.10_eclipse的使用和Object类型
    团队项目推荐:礼物推荐 —— by Xizhou
    团队项目推荐:不一样的旅游——by Lijun
    团队项目推荐:自动化卡通人脸生成——by Feng Nie
    团队项目推荐:手机社交照片管理软件——by Zhaofan
    Team Project Proposal:App:等车时间预测(重写) -- by DengPan
    对MSRA-USTC 2011的 meng-meng(萌萌) 的team project的学习和评价
    Team Project Proposal: All-in-one多信息源整合的移动应用[Revised in 8th Oct]——by Yuchan
    Team Project Proposal:App:等车时间预测 -- by DengPan
    Team Project Proposal:手机音频美化APP——by Kun Qian
  • 原文地址:https://www.cnblogs.com/aloney/p/4527640.html
Copyright © 2020-2023  润新知