指针
1
#include <stdio.h>
#include <string.h>
int main() {
char* p1 = "12345", * p2 = p1; //允许!
char* p3, p4[80];
//strcpy(p3,p1); 此时p3为野指针!
p3 = "12345"; //允许
strcpy(p4, p1); //p4="12345";不允许!
puts(p1); puts(p2); puts(p3); puts(p4);
p4[2] = 'A';//p1[2]=p2[2]=p3[2]='A';不允许
} //
2
*的优先级大于++
3
char *p="此时指针可以被修改,即:
指向其他字符串,但字符串的内容不
允许修改(否则导致运行时错误)";
*(p+2)='2';错误!但p=a;正确!
4
指针不能直接输入,可以用函数拷贝
void str_copy(const char *f,char *t) {
for (unsigned i=0;i<=strlen(f);i++)//注意这里相当于strlen(f)+1,因为要把'\0'拷贝
t[i]=f[i];
}
void str_copy(const char *f,char *t) {
while (*f) *t++=*f++;
*t='\0';
}
void str_copy(const char *f,char *t)
{
while (*t++=*f++);
}
下面的程序用5种方法实现字符串拷贝,其中的部分有错误,请你进行改正。
#include <stdio.h>
#include <string.h>
#define BUF_SIZE 10
#define setString for (i=0;i<BUF_SIZE;i++) string1[i]=i
#define showString printf("[%s]\n",string1)
void strCpy1(char* t,const char *f);
void strCpy2(char* t,const char *f);
void strCpy3(char* t,const char *f);
int main() {
int i;
char string[BUF_SIZE]="123456789";
char string1[BUF_SIZE];
setString;
strcpy(string1,string);
showString;
setString;
strncpy(string1,string,strlen(string));
showString;
setString;
strCpy1(string1,string);
showString;
setString;
strCpy2(string1,string);
showString;
setString;
strCpy3(string1,string);
showString;
return 0;
}
void strCpy1(char* t,const char *f) {
for (unsigned i=0;i<strlen(f);i++)
t[i]=f[i];
}
void strCpy2(char* t,const char *f) {
while (*f) *t++=*f++;
}
void strCpy3(char* t,const char *f) {
while (*++t=*++f);
}
//输出5行的[123456789]
5
正序输出字符串(前递归)
void showString1(char *s) {
if (*s=='\0') return;
putchar(*s);
showString1(s+1);
}
反序输出字符串(尾递归)
void showString2(char *s) {
if (*s=='\0') return;
showString2(s+1);
putchar(*s);
}
6
数组指针
#include <stdio.h>
int main() {
char (*name)[7]; //(指向)数组(的)指针!
char s[3][7]=
{"12345\n","54321\n","abcde\n"};
name=s; //指向多维数组!
for (int i=0;i<3;i++)
printf("%s",name+i);
for (i=0;i<6;i++)
printf("%c",(*(name+2))[i]);
for (i=0;i<6;i++)
printf("%c",*(*(name+1)+i));
}
7
8
//要求用递归实现两个字符串的比较。
#include <stdio.h>
int strCmp(char* s, char* t);
int main() {
printf("%d\n", strCmp("abc", "abcd"));
printf("%d\n", strCmp("abcde", "abcd"));
printf("%d\n", strCmp("abdab", "abcab"));
printf("%d\n", strCmp("abcab", "abdab"));
printf("%d\n", strCmp("abc", "abc"));
return 0;
}
//功 能:比较两个字符串s和t
//入口参数:s和t分别为指向两个字符串的首地址
//返 回 值:字符串相同返回0,字符串s<字符串t返回负数,否则返回正数
int strCmp(char* s, char* t) {
if (*s == '\0' && *t == '\0')return 0;
if (*s == *t)
{
return strCmp(s + 1, t + 1);
}
return *s - *t;
}
9
sizeof和strlen的区别
(https://blog.csdn.net/m0_62534424/article/details/121895300)
sizeof计算数据类型占空间的大小
strlen返回字符串的长度
sizeof会包含'\0',而strlen不会包含'\0'
#include <stdio.h>
#include <string.h>
int main(void) {
char st[] = "a0\007a\00\0";
printf("%d,%d\n", strlen(st), sizeof(st));
}
函数输出4,7 //strlen也不会包括中间的'\0'