zoukankan      html  css  js  c++  java
  • 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)很常用 我就总遇到想对一个字符串多次读取的情形
  • 相关阅读:
    算法与数据结构基础
    算法与数据结构基础
    算法与数据结构基础
    算法与数据结构基础
    算法与数据结构基础
    算法与数据结构基础
    最佳实践 根据状态操作,这样能避免吃掉异常
    最佳实践 状态设计
    Android HTTPS如何10分钟实现自签名SSL证书
    马桶选购
  • 原文地址:https://www.cnblogs.com/aloney/p/4527640.html
Copyright © 2011-2022 走看看