字符串函数atoi
#include <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <string.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <string.h>
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<strlen(str);i++){
a[i] = -1; //-1还没有打印过 1打印过
}
for (int i = 0; str[i]!=0; i++) {
//1打印过 结束本次循环
if (a[i]==1) {
continue;
}
printf("%c",str[i]);
int count = 0;
for (int j = i; str[j]!=0; j++) {
if (str[i]==str[j]) {
count++;
a[j] = 1;
}
}
printf("%d",count);
}
}