c学习记录
- ‘’单引号是字符 “”双引号是字符串类型‘\0’表示空格
2.写出strncpy函数
#include<stdio.h> char strnncpy (char *dest, char *src, size_t n) { int i; for(i=0; i<n; i++){ dest[i] = src[i]; printf("i = %d\n",i); } } int main() { char *a,*b; a = "abcdefg"; b = NULL; strnncpy (b,a,3); printf("the result is %s\n",b); return 0; }
这个错在哪儿?
b没有分配空间
加一条b=(char*)malloc(100)就行了!
另外函数中还要加一条判断b的空间是否分配:if(dest == NULL)return NULL;函数类型变为char*(因为NULL的类型是void*是指针)
修改后的代码为:
#include<stdio.h> char strnncpy (char *dest, char *src, size_t n) { int i; for(i=0; i<n; i++){ dest[i] = src[i]; printf("i = %d\n",i); } } int main() { char *a,*b; a = "abcdefg"; b = NULL; strnncpy (b,a,3); printf("the result is %s\n",b); return 0; }
2.用C语言或C++语言实现行程压缩的解压缩
关于行程压缩:如原文为”111AAKKKK”,则压缩后为”13A2K4″,即用代码和代码重复的次数来表示原始信息,实现一个简单的压缩功能。
v
oid decode(char * dest, char * src) { int _num=0; while( *src != '\0') { _num = *(src+1)-0x30;//0x30即为48,应该是字符型与整型的转换差值。例如'1'到1的转换。 memset(dest, *src, _num);//void *memset(void *s, char ch, size_t n);将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s dest+=_num; src+=2; } }
以上函数有以下假设:
1. dest与src指针均不为NULL//NULL的类型是void*值是0!!
2. dest的存储空间足够大
我自己写的,欢迎大家给意见:
#include<stdio.h> #include<stdlib.h> void decode (char* dest, char* src) { char a; int count = 0; while(*src != '\0'){ a = *src; count = *(src+1)-0x30; while(count--){ *dest = a; dest ++; } src+=2; } } int main() { char* d = (char*)malloc(100); decode(d,"I3A2K4"); printf("the result is %s\n",d); return 0; }
3.指针指向的常量区,无法修改
#include <stdio.h> int main(void) { char*str = "hello"; str[0]=’b’; printf(“%s\n”,str); return0; }
char *str = "hello";有错
char str[10] = "hello"就是对的,请问有什么区别?
解答:
char *str = "hello";这样声明str在栈上,而指向的字符串在只读存储区(常量区),不能修改
char str[10] = "hello" 这样声明str在常量存储区和栈区各有一个串hello,栈区为副本, 你str[0]来修改的实际上是修改的副本
综上,常量区不能被修改
验证:
int main(void) { char*str = "hello"; str[1]= 'c'; printf("%s\n",str); return0;
}真不能修改。
还有个例子
#include <stdio.h> #include <string.h> int main() { char*ch1 = " "; char*ch2 = "def"; while(( *(ch1++) = *(ch2++) ) != '\0'); printf("%s\n",ch1); return0; }
出错了。为什么呢?因为while( ( *(ch1++) =*(ch2++) ) != '\0'); 指针指向常量区,是不能赋值的 比如说 char *ch1 = " "; ch1 = 'c';这是错误的。
4
冒泡排序
Maopaosor_1.c #include<stdio.h> #include<stdlib.h> void sort(char string[]) { int i,j; char temp; for(i=0; string[i]!='\0'; i++) { j=0;string[j+i+1] != '\0',j++//此处不能写成j=i,因为这种从前到后的循环是把最大/小的放到最后(同理要让最大/小的放到最前,就需要循环从后往前),并不是把最小的先放在前面,所以在进行完i=0的第一次排序后,string[0]不一定是最小的,还需要继续比较;注意比较的边界问题,最后的边界是j+i+1,并不是只是到j+i,边界可以这样考虑:i=0时,没排好的位数是最多了,最后一位就为j+1,这也就是边界。 { if(string[j] > string[j+1]) { temp = string[j]; printf("%d,%c\n",j,temp); string[j] =string[j+1]; string[j+1] = temp; } } } } int main(int argc ,char** argv) { /* char string_a[128] = {0}; printf(" %s\n",argv[1]); sort(argv[1]); printf("the result is %s\n",argv[1]); */ char string_a[] = "dcba"; printf(" %s\n",string_a); sort(string_a); printf("the result is %s\n",string_a); return 0; }
5.链表创建
#include<stdio.h> #include<time.h> #include<stdlib.h> typedef int elem_type; typedef struct node { elem_type data; struct node *next; }Node; typedef Node* link_list; void create_list_head(link_list *L,int n) { link_list p; int i; srand(time(0)); *L = (link_list)malloc(sizeof(Node)); (*L)->next = NULL; for (i = 0; i < n; i++) { p = (link_list)malloc(sizeof(Node)); p->data = rand()%100+1; p->next = (*L)->next; (*L)->next = p; } } void Print(link_list head ) { printf("\n------------------------\n"); link_list temp = head; while(temp->next != NULL) { printf("%d,",temp->data); temp = temp->next; } printf("\n------------------------\n"); } int main(int argc,char** argv) { link_list *L=(link_list *)malloc(sizeof(Node)); //L is pointor point to a addr. and this addr is on heap int n = 10; create_list_head(L,n); Print(*L); return 0; } 结果: root@yhj:/home/learn/data_structure# ./a.out ------------------------ 0,10,32,7,17,44,9,61,57,14,
------------------------
没有头指针的时候头结点的地址就当头指针来用
有的话就用这个指针指向头节点的地址