Chinaunix首页 | 论坛 | 博客
  • 博客访问: 478236
  • 博文数量: 115
  • 博客积分: 5016
  • 博客等级: 大校
  • 技术积分: 1401
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-21 16:03
文章分类

全部博文(115)

文章存档

2013年(1)

2010年(17)

2009年(76)

2008年(21)

我的朋友

分类: LINUX

2009-07-13 23:21:57

字符数组练习: 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。

思路:
    程序中用i作循环变量, num统计单词个数, word作为判别是否是单词的标志,若word = 0 表示未出现单词, 如出现单词word置1。
    单词数目可由空格出现次数决定(连续若干空格作为出现一次空格;一行开头的空格不统计在内).如果测出某一个字符为非空格,而其前面的字符是空格,则表示"新单词开始",此时单词数num累加1.如果当前字符为非空格而其前面的字符也是非空格,则意味着仍是原来的单词的继续,num不累加.前面一个字符是否空格可以从word值分析,若word=0,则表示前一个字符是空格;如果word = 1,意味着前一个字符为非空格。


#include
int main()
{
    char string[81];
    int i;
    int num = 0; /* 统计单词个数 */
    int word = 0; /* 是否为单词的标示 */
    char c;

    gets(string);

    for (i = 0; (c = string[i]) != '\0'; i++)
    {
        if (c == ' ')
            word = 0;
        else
            if (word == 0)
            {
                word = 1;
                num++;
            }
    }
    printf("\nThere are %d words int the line.\n", num);
    return 0;
}

19C语言的const的含义是什么。在定义常量时,为什么推荐使用const,而不是#define

Const是只读的意思,它限定一个变量不允许被改变。

#define缺乏类型检测机制,在预处理时候有可能引发错误。

Const方面的其它知识扩展:

         问题1const变量 & const 限定的内容

下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?

  typedef char * pStr;

  char string[4] = "abc";

  const char *p1 = string; // *p1 作为整体不能被修改,但p1可以修改,p1++合法

  const pStr p2 = string; //p2作为一个整体,不能被修改,但是下面的p2++非法修改

  p1++;

  p2++;

     

问题2const变量 & 字符串常量

请问下面的代码有什么问题?

char *p = "i''''''''m hungry!"; //定义的是字符串常量
  p[0]= ''''''''I'''' //不能修改字符串常量
  

问题:const变量 & 字符串常量2

  char a[3] = "abc" 合法吗?使用它有什么隐患?

没有考虑到字符串结束符‘\0’,所以会产生意想不到的错误。

  比如以下程序:

int main()

{

      int i;

    char p[6] = {''''''''a'''''''',''''''''b'''''''',''''''''c'''''''',''''''''d'''''''',''''''''e'''''''',''''''''f''''''''};

    printf("%s",p);

    while(1);

    return 0;

}

运行后显示: abcdef@

问题3const & 指针

类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?    

1)const在前面

a. const int nValue //nValueconst

把类型int撇开,变量nValue作为一个整体,因此 nValueconst型;

b. const char *pContent; //*pContentconst, pContent可变

把类型char撇开,变量 *pContent作为一个整体,因此 *pContentconst型;
c.
 const (char *) pContent;//pContentconst,*pContent可变

把类型char * 撇开,注意这里(char * )是一个整体,而变量 pContent作为一个整体,因此 pContentconst型;

d. char* const pContent; //pContentconst,*pContent可变

const与变量间没有类型,变量 pContent作为一个整体,因此 pContentconst型;

e. const char* const pContent; //pContent*pContent都是const

这里分为两层,外层:把类型char 撇开,变量 * const pContent作为一个整体,因此 * pContentconst型;内层:没有类型,因此 pContent const 型。

2)const在后面,与上面的声明对等 (这类型更容易判断)

a. int const nValue // nValueconst

    const与变量之间没有类型,const后面那部分整体是const型,因此nValueconst

b. char const * pContent;// *pContentconst, pContent可变

    const与变量之间没有类型,const后面那部分整体是const型,因此 * pContentconst

c. (char *) const pContent;//pContentconst,*pContent可变

    const与变量之间没有类型,const后面那部分整体是const型,因此 pContentconst

d. char* const pContent;// pContentconst,*pContent可变

    const与变量之间没有类型,const后面那部分整体是const型,因此 pContentconst

e. char const* const pContent;// pContent*pContent都是const

分为两层,外层:撇开类型charconst后面那部分整体* const pContentconst型,因此 * pContentconst型;内层:constpContent之间无类型,因此pContentconst型。

 

C++CONST

   C中常用:#define 变量名 变量值定义一个值替代,然而却有个致命缺点:缺乏类型检测机制,这样预处理理在C++中成为可能引发错误的隐患,于是引入const.

const使用:

1. 用于指针的两种情况:const是一个左结合的类型修饰符.

   int const *A; //A可变,*A不可变

   int *const A; //A不可变,*A可变

2.限定函数的传递值参数:

void function(const int Var); //传递过来的参数在函数内不可以改变.

3.限定函数返回值型.

const int function(); //此时const无意义

const myclassname function(); //函数返回自定义类型myclassname.


20
C语言的volatile的含义是什么。使用时会对编译器有什么暗示。

         volatile的本意是易变的

由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化,但有可能会读脏数据。当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

下面是volatile变量的几个例子:
1).
并行设备的硬件寄存器(如:状态寄存器)
2).
一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3).
多线程应用中被几个任务共享的变量
    
嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。

Volatile的完全扩展:
1).
一个参数既可以是const还可以是volatile吗?解释为什么。

是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2).
一个指针可以是volatile 吗?解释为什么。

是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3).
下面的函数有什么错误:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
   
这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由于*ptr的值可能被意想不到地该变,因此ab可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}

1.//整数转换成字符串itoa函数的实现

#include "stdafx.h"

#include

using namespace std;

void itoaTest(int num,char str[] )

{

       int sign = num,i = 0,j = 0;

       char temp[11];

       if(sign<0)//判断是否是一个负数

       {

              num = -num;

       };

       do

       {

              temp[i] = num%10+'0';        

              num/=10;

              i++;

       }while(num>0);

       if(sign<0)

       {

              temp[i++] = '-';

       }

       temp[i] = '\0';

       i--;

       while(i>=0)

       {

              str[j] = temp[i];

              j++;

              i--;

       }

       str[j] = '\0';

}

2. //字符串转换成整数atoi函数的实现

int atoiTest(char s[])

{

       int i = 0,sum = 0,sign;    //输入的数前面可能还有空格或制表符应加判断

       while(' '==s[i]||'\t'==s[i])

       {

              i++;

       }

       sign = ('-'==s[i])?-1:1;

       if('-'==s[i]||'+'==s[i])

       {

              i++;

       }

       while(s[i]!='\0')

       {

              sum = s[i]-'0'+sum*10;

              i++;

       }    

       return sign*sum;

}

3.//字符串拷贝函数

#include "stdafx.h"

#include

#include

#include

using namespace std;

char *srcpy(char *dest,const char *source)

{

       assert((dest!=NULL)&&(source!=NULL));

       char *address = dest;

       while(*source!='\0')

       {

              *dest++=*source++;

       }

       *dest = '\0';

       return address;

}

4.//判断输入的是否是一个回文字符串

#include "stdafx.h"

#include

#include

using namespace std;

//方法一:借助数组

bool isPalindrome(char *input)

{

       char s[100];

       strcpy(s,input);

       int length = strlen(input);

       int begin = 0,end = length-1;

       while(begin

       {

              if(s[begin]==s[end])

              {

                     begin++;

                     end--;

              }

              else

              {

                     break;

              }           

       }

       if(begin

       {

              return false;

       }    

       else

       {

              return true;

       }     

}

//方法二:使用指针

bool isPalindrome2(char *input)

{

       if(input==NULL)

              return false;

       char *begin = input;

       char *end = begin+strlen(input)-1;

       while(begin

       {

              if(*begin++!=*end--)

                     return false;

       }

       return true;

}

int main(int argc, char* argv[])

{

       char *s ="1234554321";

       if(isPalindrome(s))

       {

              cout<<"True"<

       }

       else

       {

              cout<<"Fasle"<

       }

       if(isPalindrome2(s))

       {

              cout<<"True"<

       }

       else

       {

              cout<<"Fasle"<

       }

       cin.get();

       return 0;

}

5.//不使用库函数,编写函数int strcmp(char *source, char *dest),若相等返回0,否则返回-1

int strcmp(char *source, char *dest)

{

       assert(source != NULL && dest != NULL);

       while(*source++==*dest++)

       {

              if(*source=='\0'&&*dest=='\0')

                     return 0;        

       }

       return -1;

}

转自http://hi.baidu.com/vangoaph/blog/category/%CB%E3%B7%A8

阅读(580) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~