欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c学习记录

程序员文章站 2022-07-09 21:46:37
...

  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;
}
 结果:
[email protected]:/home/learn/data_structure# ./a.out 


------------------------
0,10,32,7,17,44,9,61,57,14,


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

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

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