博文

C++中如何去掉std::string对象的首尾空格(2008-07-01 21:13:00)

摘要:转自http://www.cnblogs.com/chenrj/archive/2006/11/14/560455.html   /***********write by myself***********/
/***********begin test file***********/
#include <iostream>
#include <string> int main()
{
 std::string str1 = "   hello world!   ";
 std::string trimstring = " ";
 std::cout << "str = \"" << str1 << "\"" << std::endl;
 std::cout << "str.find_first_of(' ')     : " << str1.find_first_of(trimstring)     << std::endl;
 std::cout << "str.find_first_not_of(' ') : " << str1.find_first_not_of(trimstring) << std::endl;
 std::cout << "str.find_last_of(' ')     : " << str1.find_last_of(trimstring)      << std::endl;
 std::cout << "str.find_last_not_of(' ')  : " << str1.find_last_not_of(trimstring)  &......

阅读全文(4713) | 评论:0

金山试题(2007-06-25 14:39:00)

摘要:1.      结构POINT定义如下: typedef struct tagPOINT {          int x;         int y;     } POINT 用变量var给出下面的定义 例:一个POINT 变量 答案:POINT var; a.      一个指向POINT的指针; b.      一个指向指针的指针,它指向的指针是指向一个POINT; c.      一个有16个POINT的数组; d.      一个有16个指针的数组,每个指针指向一个POINT; e.      一个指向数组的指针,该数组有16个POINT 2.      实现函数IsEven,用于判断一个给定的整数是否为偶数 3.      写一个函数,实现对给定的字符串(字符串里面包括:英文字母,数字,符号)的处理。经过处理后的字符串其内容按字母,数字,符号的顺序存放。函数声明如下:
void ParseString(char* pstr); 要求: a.      不能改函数声明; b.      不改变字母数字等在字符串中原有的出现顺序; c.      直接使用pstr所值指缓冲区,不允许另开缓冲区。 例如:给定的字符串为:A,2.d?3!e4r87we79... 输出结果为:Aderwe2348779,.?!... 4.      写一个函数,对给定整数的二进制表示......

阅读全文(3271) | 评论:2

memset 函数详细说明(2007-01-20 10:25:00)

摘要://转自 http://blog.sina.com.cn/u/49aef14b010006ez 1。void *memset(void *s,int c,size_t n)
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。

2。例子
#i nclude
#i nclude

main(){
char *s="Golden Global View";

clrscr();

memset(s,'G',6);
printf("%s",s);

getchar();
return 0;
} 
3。memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);

4。memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’;例:char a[100];memset(a, '\0', sizeof(a));

memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。

strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

5.补充:某人的一点心得
memset可以方便的清空一个结构类型的变量或数组。

如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};

对于变量
struct sample_strcut stTest;

一般情况下,清空stTest的方法:
stTest.csName[0]='\0';
stTest.iSeq=0;
st......

阅读全文(2660) | 评论:1

判断文件是否为空 (2006-11-24 12:44:00)

摘要://判断文件是否为空 //严重有问题啊,把写好的文件 换行就不行了。
#include   <iostream> 
#include <string>
#include   <fstream> 
#include <cstdlib>
using   namespace   std;  
int   main()  
{  
 ifstream   input("E:\\a.txt");  
    if(input)
 {
  string s;
  getline(input,s);
  if(s=="")
  {
   cout<<"空文件 "<<endl;
   input.close();
   ofstream output("E:\\a.txt");
   output<<"sadfd"<<endl;
   output.close();
  }
  else
  {
   ifstream output("E:\\a.txt");
   while(getline(output,s))
    cout<<s<<endl;
  }
  
 } &n......

阅读全文(6057) | 评论:0

私有构造函数(转载)(2006-11-24 09:27:00)

摘要:通常我们都将构造函数的声明置于public区段,假如我们将其放入private区段中会发生什么样的后果?没错,我也知道这将会使构造函数成为私有的,这意味着什么?

    我们知道,当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也就是说它不属于class对象本身的调用,假如构造函数是私有的,由于在class外部不允许访问私有成员,所以这将导致编译出错。
    你于是说:“哈哈。”我们制造了一个似乎无法产生对象的class.哦,当然,对于class本身,我们还可以利用它的static公有成员,因为它们独立于class对象之外,我们不必产生对象也可以使用它们。嗯,看来我们还是为带有私有构造函数的类找到了一个存在的理由。不过我们不应当满足于此,因为看上去应当还有发掘的余地。
    首先我们来认真看一下是不是真的无法创建出一个具有私有构造函数的类对象。“呃,可能未必。”你现在也许会这样说。这很好,让我们再来看看为什么,没错,因为构造函数被class私有化了,所以我们要创建出对象,就必须能够访问到class的私有域;但这一点“我们”是做不到的,那么,谁能做得到呢?class的成员可以做得到;但在我们建构出其对象之前,怎么能利用它的成员呢?噢,刚才我们刚刚提到了static公有成员,它是独立于class对象而存在的,当然,它也是公有的,“我们”可以访问得到。假如在某个static函数中创建了该class的对象,并以引用或者指针的形式将其返回(不可以以值的形式返回,想想为什么),我们就获得了这个对象的使用权。下面是例子: class WonderfulClass { public:        static WonderfulClass* makeAnObject()        {             &n......

阅读全文(2808) | 评论:0

函数返回值的疑问(转载)(2006-11-22 11:15:00)

摘要:这两天看C++有一个地方很是疑惑。 普通情况下我们在函数内进行普通值返回的时候在内存栈空间内其实是自动产生了一个临时变量temp,它是返回值的一个副本一个copy,函数在return的时候其实是return的这个临时产生的副本。-----对C++中引用的补充说明(实例) document.title="[转载]对C++中引用的补充说明(实例) - "+document.title 在[高质量c++编程]中提到 C 语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value)和指针传递(pass by pointer)。C++ 语言中多了引用传递( pass by reference)。 【规则6-3-2】在函数体的 "出口处",对 return语句的正确性和效率进行检查。         如果函数有返回值,那么函数的 "出口处"是 return语句。我们不要轻视return语句。如果 return语句写得不好,函数要么出错,要么效率低下。 注意事项如下: (1) return语句不可返回指向"栈内存 "的"指针 "或者"引用 ",因为该内存在函数体结束时被自动销毁。例如         char * Func(void)         {                 char str[] = "hello world";   // str的内存位于栈上                 …                 return str; ......

阅读全文(4648) | 评论:3

解析C++中的内部连接与外部连接(2006-11-22 08:41:00)

摘要:作者: ZQGet 出处: 论坛 责任编辑: 方舟 [ 2004-05-27 17:04 ] 在说内部连接与外部连接前,先说明一些概念。

  1.声明

  一个声明将一个名称引入一个作用域;

  在c++中,在一个作用域中重复一个声明是合法的
以下都是声明:

int foo(int,int); //函数前置声明

typedef int Int; //typedef 声明

class bar; //类前置声明

extern int g_var; //外部引用声明

class bar; //类前置声明

typedef int Int; //typedef 声明

extern int g_var; //外部引用声明

friend test; //友员声明

using std::cout; //名字空间引用声明

friend test; //友员声明

using std::cout; //名字空间引用声明

int foo(int,int); //函数前置声明
  在同一个作用域中你可以多次重复这些声明。

  有两种声明不能重复,那就是类成员函数及静态数据成员的声明

class foo
{
 static int i;
 static int i;//不可以
 public:
  int foo();
  int foo();//不可以
};
2 .定义

  一个定义提供一个实体(类型、实例、函数)在一个作用域的唯一描述。

  在同一作用域中不可重复定义一个实体。

  以下都是定义。 int y;

class foo {...};

struct bar {...};

foo* p;

static int i;

enum Color{RED,GREEN,BLUE};

阅读全文(2761) | 评论:0

如何隐藏system("pause")(2006-11-20 09:34:00)

摘要:#include <iostream>
#include <cstdlib>
using namespace std;
 
class CPause
{
   static void systemm()
   {
    system("pause");
   }
public:
     CPause()
  {
   cout<<"构造函数被调用"<<endl;
   atexit(&CPause::systemm);     }
}m_pause_;  //atexit是指定一个函数在程序结束时运行, m_pause_是CPause的实例。它的构造函数在 //main()主函数之前执行, 其实也就是利用全局对象的这个特性。
 /* example.cpp */
 
int main()
{
 cout << "Hello, World" << endl;
 return (0);
}
......

阅读全文(2863) | 评论:0

C语言-time.h从头学(转载的(2006-11-19 17:08:00)

摘要:本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。  关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元)  1.概念 
在C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作、获取和显示等等的问题。下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法.  通过学习许多C/C++库,你可以有很多操作、使用时间的方法。但在这之前你需要了解一些“时间”和“日期”的概念,主要有以下几个:  Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。  Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。  epoch:时间点。时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。  clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。  我们可以使用ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。下面......

阅读全文(19655) | 评论:7

volatile(2006-11-18 11:06:00)

摘要:volatile的用法
避免编译器优化的用法 转自<海涛的笔记>   _lindwen


volatile的本意是“易变的”

由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:

static int i=0;

int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}

/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}

程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此
可能只执行一次对从i到某寄存器的读***作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被
调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写***作都不会被优化(肯定执行)。此例中i也应该如此说明。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实
现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。



volatile 的含义
volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量......

阅读全文(1878) | 评论:0