#include
#include
/* YOUR CODE HERE */
char* find_my_mood() {
char* my_mood;
/* YOUR CODE HERE */
my_mood=malloc(6*sizeof(char));
my_mood[0]='h';
my_mood[1]='a';
my_mood[2]='p';
my_mood[3]='p';
my_mood[4]='y';
my_mood[5]='\0';
return my_mood;
}
int main() {
char* mood;
mood=find_my_mood();
/* YOUR CODE HERE */
printf("I am currently %s\n", mood);
/* YOUR CODE HERE */
free(mood);
return 0;
}
用malloc()动态分配堆内存,(返回的值是指向分配内存起始地址的指针)该函数的语法如下:
void* malloc (size_t size);
与malloc类似的函数还有realloc函数,(函数能够将已经分配的堆内存扩充到size的大小,并返指向扩充后的分配内存的起始地址的指针)语法如下:
void* realloc (void* ptr,size_t size);
#include
int main(){
char* test = "test";
test[0] = 'j';
printf("This is a %s\n", test);
char* test2 = malloc(4*sizeof(char));
realloc(test2, 21);
/* 如果你没有见过 strcpy 函数也不要担心,这一行没有问题。
我们将在之后的课程中具体讲解这个函数。 */
strcpy(test2, "This is a real test\n");
printf("%s", test2);
return 0;
}
上面程序的三大错误:
(1)分配堆内存后没有释放
(2)test存储在内存的常量区中,因此不能被修改
(3)realloc有可能将分配的堆内存移到了与原指针所指的位置不同的地址,因此必须用realloc的返回值更新test2.(当realloc第一个参数所指向的内存空间大小不足够扩大为第二个参数所指定的大小时,realloc将新分配一段足够大的内存空间,将旧的那段内存空间里的内容copy过去然后释放旧的内存空间)。
%s 字符串
%ld 长整型
%f 浮点型
%p 指针
%c 字符
strcpy函数:将一个字符串(src)复制到另一个字符串(dest)中。它的返回值是dest。注意:strcpy在复制字符串时会自动在末尾加上\0,因此dest的长度必须必src多至少一个字符;如果dest的长度小于这个长度,运行时会碰到 段错误(Segmentation Fault)。
char* strcpy(char * dest, char* src);
string.h提供了一个strlen函数:
size_t strlen(const char* str);
这个函数在输入的字符串str中寻找 \0 ,返回从第一个字符到第一个 \0 的长度(不包括\0)。注意:如果用一个长度为100的数组存储了一个实际长度只有5的字符串,strlen会返回5,而不是100。
strcat函数(将src里存储的字符串接到dest的后面,它的返回值也是dest):
char* strcat(char* dest, char* src);
strcmp函数比较两个字符串是否完全一致:
int strcmp(char* str1, char* str2);
在处理输入值时,用strtok函数将不同的参数分隔开:
char* strtok(char* str, const char* delimiters);
strtok函数将输入的字符串str用输入的分隔符delimiters分为更短的字符串。delimiters是一个含有多个字符的字符串,其中每一个字符都是一个独立的分隔符。如 \n\t中 \n和\t分别可以作为独立的分隔符。注意:strtok会修改输入的字符串str;因此如果你想保留原有的字符串,最好先用strcpy将原有的字符串复制到另一个字符串里,然后再将字符串输入到strtok里分隔。
当我们将一个字符串str输入到strtok里后,strtok会返回一个指向第一个由非分隔符字符的指针的分割片段;之后的每一次调用,我们都会把NULL作为第一个参数,如果调用成功后就会返回下一个分割片段,如果已经到达str的末尾则会返回NULL。
题目:统计情书的love出现次数
1
1
1