zoukankan      html  css  js  c++  java
  • c学习记录

    1. ‘’单引号是字符  “”双引号是字符串类型‘’表示空格

    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
    ",i);
            }
    }
    int main()
    {
     char *a,*b;
     a = "abcdefg";
     b = NULL;
     strnncpy (b,a,3);
     printf("the result is %s
    ",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
    ",i);
            }
    }
    int main()
    {
     char *a,*b;
     a = "abcdefg";
     b = NULL;
     strnncpy (b,a,3);
     printf("the result is %s
    ",b);
     return 0;
    }


    2.用C语言或C++语言实现行程压缩的解压缩


    关于行程压缩:如原文为”111AAKKKK”,则压缩后为”13A2K4″,即用代码和代码重复的次数来表示原始信息,实现一个简单的压缩功能。


    v

    oid decode(char * dest, char * src) {
    
    
    
    
        int _num=0;
    
    
    
    
        while( *src != '') {
    
    
            _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 != ''){
                    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
    ",d);
            return 0;
    }
    


    3.指针指向的常量区,无法修改

    #include <stdio.h>
    int main(void) {
           char*str = "hello";
           str[0]=’b’;
           printf(“%s
    ”,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
    ",str);
        return0;

    }真不能修改。

    还有个例子

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        char*ch1 = " ";
        char*ch2 = "def";
       
        while(( *(ch1++) = *(ch2++) ) != '');
          
        printf("%s
    ",ch1);
        return0;
    }

    出错了。为什么呢?因为while( ( *(ch1++) =*(ch2++) ) != '');  指针指向常量区,是不能赋值的   比如说  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]!=''; i++)
           {
    
               j=0;string[j+i+1] != '',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
    ",j,temp);
                            string[j] =string[j+1];
                            string[j+1] = temp;
                    }
     
               }
           }
    }
    int main(int argc ,char** argv)
    {
    /*       char string_a[128] = {0};
           printf(" %s
    ",argv[1]);
           sort(argv[1]);
           printf("the result is %s
    ",argv[1]);
    */
     
           char string_a[] = "dcba";
           printf(" %s
    ",string_a);
           sort(string_a);
           printf("the result is %s
    ",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("
    ------------------------
    ");
        link_list temp = head;
    while(temp->next != NULL)
        {
            printf("%d,",temp->data);
            temp = temp->next;
        }
        printf("
    ------------------------
    ");
    }
    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,


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

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

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

  • 相关阅读:
    Oracle OCP提纲
    Oracle redo 日志损坏的几种情况下的恢复
    Oracle 归档开启切换和归档日志删除(单实例和RAC)
    MySQL mysqldump备份与恢复
    Oracle 卸载
    MySQL脚本自动安装mysql-5.6.15-linux-glibc2.5-x86_64.tar.gz
    Oracle session出现大量的inactive
    Oracle 备份与恢复基础
    NuGet 下载dll
    Azure Service Bus
  • 原文地址:https://www.cnblogs.com/number10/p/3931145.html
Copyright © 2011-2022 走看看