• 一些算法练习题


    1. 句子反转

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 
     5 void reverse_word(char *string, int len);
     6 void reverse_sentense( char *string);
     7 
     8 int main(int argc, char* argv[])
     9 {    
    10     char str[1000];
    11     printf("please input reverse string:
    ");
    12     gets(str);
    13     //scanf("%s",str);
    14     printf("before = %s
    ",str);
    15     reverse_sentense(str);
    16     printf("after = %s
    ",str);
    17     return 0;
    18 }
    19 
    20 void reverse_sentense( char *string)
    21 {
    22     int temp = 0;
    23     int j;
    24     int i = strlen(string);
    25     if((string==NULL)||(i>1000))
    26         printf("input sentense string not valid
    ");
    27     for(j=0;j<i+1;j++)
    28     {
    29         if((*(string+j)==0x20)||(*(string+j)==0x0))
    30         {
    31             //printf("find pos j = %d, temp=%d
    ",j,temp);
    32             reverse_word((char*)string+temp, j-temp);
    33             temp=j+1;
    34         }
    35         
    36     }
    37     reverse_word(string,strlen(string));
    38     
    39 }
    40 
    41 void reverse_word(char *string, int len)
    42 {    
    43     char temp;
    44     int j;
    45     if((string==NULL)||(len>1000))
    46         printf("input word string not valid
    ");
    47     for(j=0;j<len/2;j++)
    48     {
    49         temp = *(string+j);
    50         *(string+j) = *(string+len-1-j);
    51         *(string+len-1-j) = temp;
    52     }
    53     return;
    54 }

    1. 编译存在警告:warning: 'gets' is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations] 。gets在新版的编译器中一般认为是危险的,因为有可能导致越界访问,可以忽略这样的警告。

    如果使用scanf接收字符串的话,在串首遇到空格的话,跳过,继续寻找下一个非空格字符,在串中遇到空格时,会结束字符串的输入,因此实现比较困难。

    向缓冲区读取字符时
    1.scanf()用%c,%s空格键,Tab键,回车键结束一次输入,不会舍弃最后的回车符或空格或Tab(即还在缓冲区中),可使用getchar来吸收scanf()执行之后的换行符。
    2.getchar()以回车键结束,也不会舍弃回车符(即存入缓存区)
    3.gets()以换行符结束,但之后会舍弃换行符并以'',代替(意思是' '不会被代入到字符数组中,也不会将换行符存入到缓存区)也就是说:gets()函数读取到 (我们输入的回车)于是停止读取,但是它不会把 包含到字符串里面去。然而,和它配合使用的puts函数,却在输出字符串的时候自动换行。
     
    2. 29行字符比较,可以使用ASCII值比较,也可以直接比较字符:
      if((*(string+j)==' ')||(*(string+j)==''))
    对于字符串,不能直接使用==进行比较,需要使用strcmp等函数
     
    3.
        char *str = "2356 7890";
        reverse_sentense(str);
        printf("reverse_sentense = %s
    ",str);

    str指向text段,程序运行会出错(segment fault);

        char str[] = "2356 7890";
        reverse_sentense(str);
        printf("reverse_sentense = %s
    ",str);
        return 0;

    str指向栈空间(数据仍然存放text段,编译器会优化为拷贝到栈空间),程序运行正常;

     

     2. 字符串转整形

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 
     5 
     6 int main(int argc, char* argv[])
     7 {    
     8     char str[1000] = "2356";
     9     char *str2 = str;
    10     unsigned int num = 0;
    11 
    12     while(*str2 != '')
    13     {
    14         num= num*10+*str2-'0';
    15         str2++;
    16     }
    17     printf("num = %d
    ",num);
    18     return 0;
    19 }


    1.  str作为数组名,其内涵在于其指代实体是一种数据结构,这种数据结构就是数组;其外延在于其可以转换为指向其指代实体(数组的首地址)的指针,而且是一个指针常量。这个指针常量不能用于左值操作:

        while(*str != '')
        {
            num= num*10+*str-'0';
            str++;
        }

    编译出错

    但是如果将str作为形参传入函数使用,它会被自动转换为普通指针,可以用于左值操作。

    2.

    char str[10];

    char* pStr = str;

    sizeof(str) ----> 10

    sizeof(pStr) ----> 4

    如果将str作为形参传入函数后再计算sizeof(str),其会转换普通指针,结果为4

    3. 最长无重复子串

     1 int main(int argc, char* argv[])
     2 {    
     3     int result;
     4     char str[] = "123412567890";
     5     result = get_longest_char(str);
     6     printf("get_longest_char = %d
    ",result);
     7     return 0;
     8 }
     9 
    10 
    11 
    12 int get_longest_char(char* str)
    13 {
    14     int ascii_array[256];
    15     int i,j,res=0,temp=0;
    16     
    17     memset(&ascii_array[0],0,sizeof(ascii_array));
    18     
    19     for(i=0;i<strlen(str);i++)
    20     {
    21 
    22         for(j=i;j<strlen(str);j++)
    23         {
    24             if((ascii_array[*(str+j)])==0)
    25             {
    26                 ascii_array[*(str+j)] = 1;
    27             }
    28             else
    29             {
    30                 temp = j-i;
    31                 break;
    32             }
    33             temp = j-i+1;
    34             
    35         }
    36         
    37         if(temp>res)
    38             res = temp;
    39         
    40         //printf("i= %d,j= %d,temp = %d
    ",i,j,temp);
    41         memset(&ascii_array[0],0,sizeof(ascii_array));
    42     }
    43     
    44     return res;
    45     
    46 }

    -- ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符,'0'-> 0x30, 'A'->0x41, 'a'->0x61;

  • 相关阅读:
    JS 对象定义
    JavaScript HTML DOM 元素(节点)
    DOM 事件
    DOM CSS
    DOM HTML
    DOM 简介
    JS 验证
    JS 错误
    JavaScript Break 和 Continue 语句
    JS While
  • 原文地址:https://www.cnblogs.com/DF11G/p/10112404.html
Copyright © 2020-2023  润新知