字符串的表示形式

  • 2017-10-18
  • 56

西安做網站 字符串的表示形式

  C語言中,可以用兩種方法訪問一個字符串。

用字符數組存放一個字符串,然後輸出該字符串。

【例10.24】

main(){

  char string[]=I love China!;

  printf("%s\n",string);

}

說明:和前麵介紹的數組屬性一樣,string是數組名,它代表字符數組的首地址。

 

用字符串指針指向一個字符串。

【例10.25】

main(){

  char *string=I love China!;

  printf("%s\n",string);

}

字符串指針變量的定義說明與指向字符變量的指針變量說明是相同的。隻能按對指針變量的賦值不同來區別。對指向字符變量的指針變量應賦予該字符變量的地址。

如:

    char c,*p=&c;

表示p是一個指向字符變量c的指針變量。

而:

    char *s="C Language";

則表示s是一個指向字符串的指針變量。把字符串的首地址賦予s。

上例中,首先定義string是一個字符指針變量,然後把字符串的首地址賦予string(應寫出整個字符串,以便編譯係統把該串裝入連續的一塊內存單元),並把首地址送入string。程序中的:

char *ps="C Language";

等效於:

char *ps;

ps="C Language";

【例10.26】輸出字符串中n個字符後的所有字符。

main(){

  char *ps="this is a book";

  int n=10;

  ps=ps+n;

  printf("%s\n",ps);

}

運行結果為:

book

在程序中對ps初始化時,即把字符串首地址賦予ps,當ps= ps+10之後,ps指向字符b,因此輸出為"book"。

【例10.27】在輸入的字符串中查找有無k字符。

main(){

  char st[20],*ps;

  int i;

  printf("input a string:\n");

  ps=st;

  scanf("%s",ps);

  for(i=0;ps[i]!='\0';i++)

    if(ps[i]=='k'){

       printf("there is a 'k' in the string\n");

       break;

    }

  if(ps[i]=='\0') printf("There is no 'k' in the string\n");

}

【例10.28】本例是將指針變量指向一個格式字符串,用在printf函數中,用於輸出二維數組的各種地址表示的值。但在printf語句中用指針變量PF代替了格式串。 這也是程序中常用的方法。

main(){

  static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};

  char *PF;

  PF="%d,%d,%d,%d,%d\n";

  printf(PF,a,*a,a[0],&a[0],&a[0][0]);

  printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);

  printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);

  printf("%d,%d\n",a[1]+1,*(a+1)+1);

  printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));

}

【例10.29】本例是把字符串指針作為函數參數的使用。要求把一個字符串的內容複製到另一個字符串中,並且不能使用strcpy函數。函數cprstr的形參為兩個字符指針變量。pss指向源字符串,pds指向目標字符串。注意表達式:(*pds=*pss)!=`\0'的用法。

cpystr(char *pss,char *pds){

  while((*pds=*pss)!='\0'){

      pds++;

      pss++; }

 }

main(){

  char *pa="CHINA",b[10],*pb;

  pb=b;

  cpystr(pa,pb);

  printf("string a=%s\nstring b=%s\n",pa,pb);

}

在本例中,程序完成了兩項工作:一是把pss指向的源字符串複製到pds所指向的目標字符串中,二是判斷所複製的字符是否為`\0',若是則表明源字符串結束,不再循環。否則,pds和pss都加1,指向下一字符。在主函數中,以指針變量pa,pb為實參,分別取得確定值後調用cprstr函數。由於采用的指針變量pa和pss,pb和pds均指向同一字符串,因此在主函數和cprstr函數中均可使用這些字符串。也可以把cprstr函數簡化為以下形式:

    cprstr(char *pss,char*pds)

      {while ((*pds++=*pss++)!=`\0');}

    即把指針的移動和賦值合並在一個語句中。 進一步分析還可發現`\0'的ASC碼為0,對於while語句隻看表達式的值為非0就循環,為0則結束循環,因此也可省去!=`\0'這一判斷部分,而寫為以下形式:

      cprstr (char *pss,char *pds)

{while (*pdss++=*pss++);}

表達式的意義可解釋為,源字符向目標字符賦值,移動指針,若所賦值為非0則循環,否則結束循環。這樣使程序更加簡潔。

【例10.30】簡化後的程序如下所示。

cpystr(char *pss,char *pds){

    while(*pds++=*pss++);

}

main(){

  char *pa="CHINA",b[10],*pb;

  pb=b;

  cpystr(pa,pb);

  printf("string a=%s\nstring b=%s\n",pa,pb);

}

西安做網站


字符串的表示形式——西安做網站-www.xgktgj.com