18.字符串函数、字符串与指针

字符串函数atoi

#include 
#include 
int myAtoi(const char *str);
int main(int argc, const char * argv[]) {
    printf("%d %d \n",atoi("-123er"),myAtoi("-123er"));
    return 0;
}
int myAtoi(const char *str){
    //找到第一个非空白字符
    int i = 0;
    for (; str[i]!=0; i++) {
        if (str[i]!=' '&&str[i]!='\n'&&str[i]!='\t') {
            break;
        }
    }
    
    //str[i]是第一个非空白字符
    if(str[i]!='+'&&str[i]!='-'&&(str[i]<'0'||str[i]>'9'))
    {
        return 0;
    }
    
    //开始转换
    int isPositive = 1;//1正数  -1 负数
    if (str[i] == '+') {
//        isPositive = 1;
        i++;
    }
    if (str[i] == '-') {
        isPositive = -1;
        i++;
    }
    int value = 0;//转换的数值
    for (int j = i; str[j]!=0; j++) {
        //当出现第一个非数字字符停止转换
        if (str[j]<'0'||str[j]>'9') {
            break;
        }
        
        value =value*10+(str[j]-'0');
    }
    
    return value*isPositive;
    
}

字符串与指针

#include 
#include 
#include 

int main(int argc, const char * argv[]) {
   
    //将字符串赋值给字符数组
    //字符串存储在栈区
    char a[10] = "HELLO";
    strcpy(a, "WORLD");
    //"HELLO"返回的是字符串的地址,
    //将字符串地址赋值给一个字符指针
    //字符串存储在常量区,
    char *p = "HELLO";
    //常量区的数据是不允许修改的。
    strcpy(p, "WORLD");
    
    //堆区
    //在堆区开辟空间,将空间首地址保存在指针q中
    char *q = (char*)malloc(sizeof(char)*10);
    //将指针的指向转到常量区的“HELLO”字符串的首地址上
//    q = "HELLO";
    //"HELLO"在堆区存放
    strcpy(q, "HELLO");
    printf("%s\n",q);
    
    strcpy(q, "WORLD");
    printf("%s\n",q);
    free(q);//释放堆空间
    
    
    return 0;
}

字符串的练习题

1.  计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为10mm,数字宽度为5mm、标点符号宽度为8mm。
2.  接上题,如果规定行的宽度为100mm,将某个字符长度超过50的字符串截断,恰好使100mm宽的行能容纳。输出这个被截断的子数组。
#include 
#include 

int lengthOfString(char *str);
char* findSubString(char*str);

int main(int argc, const char * argv[]) {
   
    char a[100] = "sak.jkj!klbw;;;1234.hgvhv;;ash542'''633dtye67823wearefamilly!";
    printf("第一题\n");
    printf("length = %d\n",lengthOfString(a));
    
    printf("第二题\n");
    char *p = findSubString(a);
    printf("%s\n",p);
    free(p);//避免内存泄露

    return 0;
}

/*
 1. 计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为10mm,数字宽度为5mm、标点符号宽度为8mm。
*/

int lengthOfString(char *str){
    int length = 0;
    for (int i = 0; str[i]!=0; i++) {
        
        if ((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')) {
            length+=10;
        }else if(str[i]>='0'&&str[i]<='9'){
            length+=5;
        }else{
        
            length+=8;
        }
        
    }
    
    
    return length;

}

/*
 2. 接上题,如果规定行的宽度为100mm,将某个字符长度超过50的字符串截断,恰好使100mm宽的行能容纳。输出这个被截断的子数组。

 */

char* findSubString(char*str){

    for (int i = 0 ; str[i]!=0; i++) {
        int length = 0;
        int j = 0;
        for (; str[i+j]!=0; j++) {
            if ((str[i+j]>='a'&&str[i+j]<='z')||(str[i+j]>='A'&&str[i+j]<='Z')) {
                length+=10;
            }else if(str[i+j]>='0'&&str[i+j]<='9'){
                length+=5;
            }else{
                
                length+=8;
            }
            if (length>=100) {
                break;
            }
            
        }
        if (length == 100) {
            //找到了!
            //i  --> i+j
            char * p = (char*)malloc(sizeof(char)*(j+1));

            for (int k = i; k<=i+j; k++) {
                p[k-i] = str[k];
//                printf("%c",str[k]);
            }
            return p;
            
        }
        
    }
//    printf("没有找到!");
    return NULL;

}

字符串练习题2

#include 
#include 
void compressString(const char *str);
int main(int argc, const char * argv[]) {
   
    
    compressString("helloworld");
    
    return 0;
}

/*
 
 7.编写函数,传入一个字符数组,无需返回值,将数组中字符压缩后打印。
 传入:“helloworld”
 打印:h1e1l3o2w1r1d1
 */

void compressString(const char *str){

//创建对应的数组 ,每个数组对应字符串中一个字符,数组元素的值代表字符串中的字符是否实现。
    //c99中数组的大小可以是变量,但是当数组的大小是变量时,不允许在定义数组的时候给数组初始化
    int a[strlen(str)];
    
    for(int i = 0;  i

你可能感兴趣的:(18.字符串函数、字符串与指针)