指針數(shù)組暑刃,還是向數(shù)組的指針?
由于方括號[]的優(yōu)先級要高于*號膜眠,所以
char *m[5]表示一個由五個指針構(gòu)成的數(shù)組岩臣。
而
(char *)m[5]表示一個指針,一個指向有五個元素的數(shù)組的指針宵膨。
數(shù)組和指針的區(qū)別
char m1[]="abcdefg";
char m2*="abcdefg"
- m1是一個常量架谎,是不能執(zhí)行m1++的,但是可以通過m1+1來訪問m1的第二個元素辟躏。
- 而m2是個變量谷扣,可以進行m2++。
- m1的值可以賦給m2,但是m2的值不能賦給m1
二維數(shù)組和指針數(shù)組的區(qū)別
char a1[5][81];
char *a2[5]
a1是一個有5個元素的數(shù)組捎琐,而每個元素又是一個81個char的數(shù)組会涎,所以聲明a1的時候,就為之聲明了5*81個char的空間瑞凑。
a2是一個含有5個指針的數(shù)組末秃,每個指針指向一個字符串,字符串所占用的空間可由初始化字符串時的字符串長度決定籽御。
所以练慕,第二種聲明方式比第一種聲明方式比較節(jié)省空間。
三個輸入函數(shù)的區(qū)別
gets()遇到換行符就會停止輸入技掏,它適合用來讀取一行字符串贺待。返回一個指向char類型的指針值。
scanf()遇到空格就會停止輸入零截,所以它適合用來讀取單詞麸塞。返回成功讀取項目的個數(shù)。
fgets()既能讀空格又能讀換行符涧衙,它有三個參數(shù)哪工,fget(指針的地址奥此,讀入的長度,輸入文件)雁比,當通過鍵盤輸入時稚虎,第三個參數(shù)為stdin。
當讀到第二個參數(shù)的長度或者換行符時偎捎,停止讀取蠢终。
常用的字符串函數(shù)
函數(shù)都包含在string.h頭文件里
strcat()函數(shù)
strcat()函數(shù)需要兩個字符串參數(shù),將第二個字符串的一份拷貝添加到第一個字符串的結(jié)尾茴她。從而連接了兩個字符串寻拂。返回值是第一個參數(shù)更新后的值。
strncat()函數(shù)
strncat(char * c1丈牢,char * c2祭钉,int n);
后面的n為讀c2的前n個字符,讀到第n個字符或者遇到換行符都會停止讀取己沛,然后將讀取到的字符接到c1的末尾
strcmp()函數(shù)
strcmp(cha * c1,char * c2);
顧名思義慌核,string compare,比較c1和c2申尼,
如果c1c完全相同垮卓,則返回0。
如果不同师幕,比較第一個c1c2不同的字符扒接,如果c2中的字符的ASCII值大于c1中的字符的ASCII值,返回1们衙,否則钾怔,返回-1。
strncmp()函數(shù)
strcmp(cha * c1,char * c2,n);
比較c1c1的前n個字符蒙挑,返回結(jié)果與strcmp()函數(shù)相同.
strcpy()函數(shù)
有兩個字符串參數(shù)宗侦,將第二個字符串參數(shù)復(fù)制到第一個字符串參數(shù),返回第一個參數(shù)的值忆蚀。
由于字符串的名字只是一個地址矾利,所以在初始化字符串之后就不能再給字符串復(fù)制,像這樣“str="abcde"
只能strcpy(str,"abcde")”
strchr()函數(shù)
char *strchr(const char *s,int c);
返回字符串中存放字符c的第一個位置的指針馋袜,如果沒有找到該字符男旗,就返回空指針。
//strchr函數(shù)
#include<stdio.h>
#include<string.h>
int main()
{
char *a="abcdefg";//聲明一個指針欣鳖,
char c='e';
char *b;//用來存放返回的指針
b=strchr(a,c);
printf("%p %p\n",a,b);//輸出的結(jié)果是兩個相差4的地址察皇,因為e字符數(shù)組里的第4個元素。
b=strchr(a,'z');
printf("%p %p\n",a,b);//輸出的b是8個0的空指針
return 0;
}
strpbrk(const char *s1,const char *s2)函數(shù)
返回一個指針,指向s1字符串中存放s2中任一字符串的地方什荣,如果找不到矾缓,則返回空指針
#include<stdio.h>
#include<string.h>
int main()
{
char *s1="abcdefg";
char *s2="efghijk";//s1和s2中第一個共同的元素是e
char *a;
a=strpbrk(s1,s2);
printf("%p %p %d\n",s1,a,a-s1+1);//第一個地址和第二個地址相差4,e是s1中的第5個元素
return 0;
}
strrchr(const char *s,int c)
和strchr()類似稻爬,不過他返回的是最后一次出現(xiàn)c的地方
字符串排序
原理是冒泡排序加strcmp函數(shù)的調(diào)用嗜闻。并不難。
#include<stdio.h>
#include<string.h>
#define SIZE 81
#define LIM 20
#define HALT " "
void stsrt(char *strings[],int num);
int main()
{
char input[LIM][SIZE];
char *ptstr[LIM];
int ct = 0;
int k;
printf("Input up to %d lines, and I will sort them.\n",LIM);
printf("To stop, press the Enter key at a line's start. \n");
while(ct < LIM && gets(input[ct]) != NULL && input[ct][0] != '\0')
{
ptstr[ct] = input[ct];
ct++;
}
stsrt(ptstr, ct);
puts ("\nHere's the sorted list: \n");
for(k = 0;k < ct; k++)
puts(ptstr[k]);
return 0;
}
void stsrt(char *strings[],int num)
{
char *temp;
int top,seek;
for(top = 0; top < num-1; top++)
for(seek = top + 1; seek < num ; seek++)
if(strcmp(strings[top], strings[seek]) > 0)
{
temp = strings[top];
strings[top] = strings [seek];
strings[seek] = temp;
}
}