c学习记录

  1. ‘’单引号是字符  “”双引号是字符串类型‘\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,


------------------------

没有头指针的时候头结点的地址就当头指针来用

有的话就用这个指针指向头节点的地址

posted @ 2013-12-10 18:12  10号  阅读(278)  评论(0编辑  收藏  举报