字符串汇总

来源:互联网 发布:linux怎么开启防火墙 编辑:程序博客网 时间:2024/05/20 03:47
 

基本上求职者进行笔试时没有不考字符串的。字符串也是一种相对简单的数据结构,结合指针,容易多次引起面试官反复发问。我曾不止一次在笔试或面试时遇到下面几道试题。事实上,字符串也是一个考验程序员编程规范和编程习惯的重要考点。不能忽视这些细节,因为这些细节会体现你在操作系统、软件工程、边界内存处理等方面的知识掌控能力。

一、整数与字符串之间的相互转换
1.将字符串转换成整数

      例如有一字符串str[]=“1234”,最直观的转换方法就是依次将每一个字符转换成相应的数字,然后乘10累加,即((1*10+2)*10+3)*10+4。想要得到每一位相应的数字,只需用每个字符减去数字0的ASCII码,即2= str[1]-'0'。
      如果字符串首字符标示的是一个负数,即str[0]=='-'。那么此时应该设置一个符号判断标示位(用来判断以后得到的整数是否需要乘-1),并把要处理的字符数组下标设置为1。
      int str_to_int(char str[])
      {
        int i=0, isNeg=0,num=0;
        if(str[0]=='-')
          {isNeg=1;
           i=1;
          }
        while(str[i])
          {num=num*10+(str[i]-'0');
           i++;
          }
        if(isNeg)
          num*=-1;
        return num;
      }


2.将整数转换为字符串
      将整数转换为字符串相对要复杂些。通过取模,并结合商与余数的关系,可以有几种方法。例如,123除以100,商为1,余数为23,这样,首先可以把“1”保存到字符串里。然后23除以10,商为2,余数为3。这样就可以得到字符串“123”了。但是,怎样来确定整数的位数确实比较麻烦。有一种相对简单的方法。
      首先将123除10取模,得到数字3,此时商为12。再将12除10取模,得到数字2,商为1。这样,我们可以得到字符串“321”,接着进行一次逆序即可得到想要的字符串。
    同样,如果该整数小于0,我们需要人为地将其变成正数,再进行取模运算!!
       char int_to_str(int num,char str[])
       {
        int i=0,j=0,isneg=0;
        char temp[10];
        if(num<0)
          {
           num*=-1;
           isNeg=1;
          }
        do{
           temp[i]=(num%10)+'0';
           num/=10;
           i++;
            }while(num)    //使用do-while结构保证当num为0时也执行循环。
        if(isNeg)
          temp[i++]='-';
        while(i>0)
          str[j++]=temp[--i];
        str[j]='/0';      //字符串结束符不能忘掉。
       }

二、传递动态内存
What will happen after running the "Tests"?
    1. #include<iostream>
       void GetMemory(char *p, int num)
        {
          p=(char *)malloc(sizeof(char)*num);
        }
        int main()
        {
         char *str=NULL;
         GetMemory(str,100);
         strcpy(str,"hello");
         return 0;
        }
      程序崩溃。毛病出在函数GetMemory中。该函数中的参数*p实际上是主函数中str的一个副本,编译器总是要为函数的每个参数做临时副本。在本程序段中,p申请了新的内存,只是把p所指向的内存地址改变了,但是str丝毫未变。因为函数GetMemory没有返回值,因此str并不指向p所申请的那段内存,所以函数GetMemory并不输出任何东西。事实上,每执行一次GetMemory就会申请一块内存,但是申请的内存却不能得到有效地释放,结果是内存一直被占用,最终造成内存泄露。
      修改方法有2种。(1)我们可以用函数的返回值来传递动态内存,把GetMemory函数的返回类型改为指针类型即可。
        char *GetMemory(char *p, int num)
        {
          p=(char *)malloc(sizeof(char)*num);
          return p;
        }
    (2)如果一定要用指针参数去申请内存,那么应该采用指向指针的指针,传str的地址给函数GetMemory。
        void GetMemory(char **p, int num)
        {
          *p=(char *)malloc(sizeof(char)*num);
        }
        int main()
        {
         char *str=NULL;
         GetMemory(&str,100);
         strcpy(str,"hello");
         return 0;
        }

    2.#include <iostream>
      using namespace std;
      char *GetMemory(void)
      {
        char p[]="hello";
        return p;
      }
      int main()
      {
        char *str=NULL;
        str=GetMemory();
        cout<<str;
        return 0;
      }
       这段代码的错误就显而易见了。因为函数GetMemory返回的是一个指向“栈内存”的指针,当调用函数结束后,该指针的地址不是NULL,但是原来的内容已经被清楚,新内容不可知。所以,程序输出的可能是乱码,也有可能正常输出。

三、字符指针
What will happen after running the "Tests"?

     #include <iostream>
     using namespace std; 
     int main()
      {
        char *str="hello,every one!";
        strcpy(str,"hello,world");
        cout<<str;
      }
       这段代码的迷惑性是很强的。程序直接使用字符指针来初始化字符串。在C++中,用双引号括起来的字符串被规定为const类型!这样,意味着str也隐含地被设置为const类型,指向的是全局的const内存区。所以,程序无法通过strcpy试图修改str字符串的内容

 

 

1、请编写一个 C 函数,该函数将给定的一个数字字符串转换成整数。

 

view plain
  1. int StrToNum(char*str)  
  2. {  
  3.     int num = 0;  
  4.     while(*str!='/0')  
  5.     {  
  6.   
  7.         num = 10*num + (*str - '0');  
  8.           
  9.         str = str +1;  
  10.     }  
  11.     return num;  
  12. }  

 

2、请编写一个 C 函数,该函数将给定的一个整数转换成字符串。

 

view plain
  1. void NumToStr(int n, char* str)  
  2. {  
  3.     char s[50];  
  4.     int i = 0, j, m;  
  5.     while(1)  
  6.     {  
  7.         m = n%10;  
  8.         s[i] = m +'0';  
  9.         i++;  
  10.         n = n/10;  
  11.         if(n<=0)  
  12.             break;  
  13.     }  
  14.       
  15.     for(j =0; j < i; j++)  
  16.         str[j] = s[i -j-1];  
  17.     str[i]='/0';  
  18.   
  19. }  

 

3、请编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。

 

view plain
  1. int LenofSubstr(char* str)  
  2. {  
  3.     int maxlen=0, i=0, j=1, len=0;  
  4.     int l;  
  5.     l = strlen(str);  
  6.     while(i<l)  
  7.     {  
  8.         if(j>=l) break;  
  9.   
  10.         if(*(str+i)==*(str+j))  
  11.         {  
  12.             i++;  
  13.             j++;  
  14.             len++;  
  15.         }  
  16.         else  
  17.         {  
  18.             if(len>maxlen)  
  19.                 maxlen = len;  
  20.             len =0;  
  21.             i++;  
  22.             j++;  
  23.         }  
  24.     }  
  25.     return maxlen+1;  
  26.   
  27. }  

 

原创粉丝点击