小学生都看得懂的C语言入门(6): 字符串

1.字符用 char 表示

#include<stdio.h>
int main()
{
    char c;
    char d;
    c=1;
    d='1';
    if (c==d){
        printf("equal\n");
    }else{
        printf("not equal\n");
    }
    return 0;
}

结果显示两者不相等, 若用%d形式输出,则有

    printf("c=%d\n",c);// 1
    printf("d=%d\n",d);//49 

如何输入'1' 给字符c ?

#include<stdio.h>
int main()
{
    char c;
    scanf("%c",&c);// 输入1 
    printf("c=%d\n",c);//'1'表示ASCII码 49
    printf("c='%c'\n",c);//'1' 这里的'' 要自己加上去!!
    return 0;
}

输入一个1进去,

#include<stdio.h>
int main()
{
    char c;
    int  i;
    scanf("%d",&i);
    c=i;
    printf("c=%d\n",c);// 
    printf("c='%c'\n",c);//
    return 0;
}

分别输入1 和 49 得到:

由此,'1' 的ASCII编码是49

 

#include<stdio.h>
int main()
{
    char c;
    int  i;
    scanf("%d",&i);
    c=i;
    printf("c=%d\n",c);// 
    printf("c='%c'\n",c);//
    if (49=='1'){
        printf("okay");
    }
    return 0;
}

输入48 ,得到 ,

说明 '1'=49, '0'=48;

#include<stdio.h>
int main()
{
    char c;
    scanf("%c",&c);
    printf("c=%d\n",c);// 1
    printf("c=%c\n",c);//49 
    return 0;
}

得到

 

2. 混合输入

#include<stdio.h>
int main()
{
    // 混合输入
    int i;
    char c;
    scanf("%d %c",&i,&c); 
    printf("i=%,c=%d,c='%c'",i,c,c);
    return 0;
}

输入 12 1

得到  i=12,c=49,c='1'

输入  12 a
得到  i=12,c=97,c='a'

字符的计算 如下

#include<stdio.h>
int main()
{
     char c='A';
    c++;
    printf ("'%c'\n",c);//'B'
    int i='Z'-'A'; 
    printf ("%d\n",i);//25
    
    return 0;
}

 

 

#include<stdio.h>
int main()
{
    printf("123\bA\n456"); // \b 往回删一个3,
    return 0;
}

 

12A
456

 

3. 字符串

 char w[]={'g','o','o','d','!'}; // 字符数组
 char w[]={'g','o','o','d','!','\0'}; //  后面加了0, 表示字符串

字符串是以0 结尾的字符, 0 与'\0' 一样, 但是与'0'不同.

 但是计算字符串的长度是不包含这个 0 的;

字符串以数组的形式存在, 可以用数组或者指针进行访问, 

string.h 中很多处理字符串的函数;

#include<stdio.h>
int main()
{
    // 定义字符串
    char *str="hello"; // 要用双引号 
    char w[]="hello";
    char line[10]="hello"; // 实际长度是5+1, 结尾还有表示结束的0; 
    printf("please in put a num"" for example 1:"); // 会自动连起来
    printf("please in put a num"
    " for example 1:");// 与上述一样
    return 0;
}
#include<stdio.h>
int main()
{
    int i=0;
    char *s="hello world";
    char *s2="hello world"; 
    printf("&i=%p\n",&i); // 打印i 的地址 
    printf("s=%p\n",s);
    printf("s2=%p\n",s2);
    return 0;
}

得到结果

&i=000000000062FE3C
s=0000000000404000
s2=0000000000404000

s s2的地址一样, 但是本地变量i 和s 相差很大, s地址很小, i 地址很大, 他们距离很远, 这是为啥??

#include<stdio.h>
int main()
{
    char *s="hello world";
    s[0]='B';// 出错
    printf("here s[0]=%c\n",s[0]); // 错了 

    return 0;
}

 

s 位于程序的代码端, 是只读的 ,不可以写, 因此不能进行修改s[0]='B', 否则程序崩溃!!

实际上 这个s 的类型是 const char *s, 由于历史原因, 编译器不接受 const  写法;

如果想要对 字符串进行修改, 就要用数组形式进行定义!!  char s[ ]="hello world!";

#include<stdio.h>
int main()
{
    int i=0;
    char *s="hello world";
//    s[0]='B';
    char *s2="hello world"; 
    char s3[] ="hello world";
    printf("&i=%p\n",&i); // 打印i 的地址 
    printf("s=%p\n",s);
    printf("s2=%p\n",s2);
    printf("s3=%p\n",s3);    
//    printf("here s[0]=%c\n",s[0]); // 错了 

    return 0;
}

得到

&i=000000000062FE3C
s=0000000000404000
s2=0000000000404000
s3=000000000062FE30

s3 的地址也在一个很大的地方!!, 是本地变量

 

4.字符串运算

    char*t="title"; // t指向了字符串
    char*s;
    s=t;  //s也指向了该字符串
    // 并没有产生新的字符串,只是让指针s 指向了 t所指的字符串, 
    // 对s 的操作就是对t做的 
#include<stdio.h>
int main()
{
    char  ss[8];
    scanf("%s",ss) ; //读入一个单词, 到空格,tab 或者回车为止 
    printf("%s#\n",ss);
    return 0;
}

 

输入hello world
得到hello#

没有读到 world, 如何让它读到??

#include<stdio.h>
int main()
{
    char  ss[8];
    char ss1[8];
    scanf("%s",ss) ; //读入一个单词, 到空格,tab 或者回车为止 
    scanf("%s",ss1);
    printf("%s#\n%s#\n",ss,ss1);
    return 0;
}

输入hello world

得到

hello#
world#

但是没有读到hello 与 world 中间的空格, 这个空格用来区分两个单词, 是个分隔符

scanf 读到空格,tab 或者回车为止, 并且他是不安全的, 因为不知道要读入的长度, 怎么处理?

scanf("%7s",ss); // 最多输入7个字符! 数组长度是8 ,算上结尾的0 ,最多7个

 

 

#include<stdio.h>
int main()
{
    char  ss[8];
    char ss1[8];
    scanf("%7s",ss) ; //读入一个单词, 到空格,tab 或者回车为止 
    scanf("%7s",ss1);
    printf("%s#\n%s#\n",ss,ss1);
    return 0;
}

 

注意:  第一个超过7个的只读了前7个, 后面断掉了, 但是第二个单词还是取了前面没读完的部分,

 

输入fahfjkhdskjfh jadshfjka
fahfjkh#
dskjfh#  

输入hjd jfahkjhfl
hjd#
jfahkjh#

其他:

 

char b[10]="";// 空字符串, b[0]='\0'
char b[]=""; // 这个数组长度只有1, 

 

 

5. 字符串的函数

 #include<string.h>

常用函数:

(1)strlen 计算长度

(2)strcmp 比较

#include<stdio.h>
#include<string.h>
int main() 
{
    char  line[]="hello";
    printf("srtlen=%lu\n",strlen(line));// 5  字符串长度 
    printf("sizeof=%lu\n",sizeof(line)); //6  占据的空间 
    return 0;
}
#include<stdio.h>
#include<string.h>
int main() 
{
    char s1[]="hello";
    char s2[]="hello";
    printf("%d\n",strcmp(s1,s2));//0 表示两者相等 ,这个有些与逻辑值不同 
    printf("%d\n",s1==s2);//0 ,地址不相同 
    return 0;
}

strcmp(s1,s2) 得到

0  s1==s2;

1  s1<s2;

-1 s1>s2;

#include<stdio.h>
#include<string.h>
int main() 
{
    char s1[]="hello";
    char s2[]="gello";
    printf("%d\n",strcmp(s1,s2));//1 
    return 0;
}

 

(3) strcpy 复制 位置对应, 从位置0开始,

(4)strcat 连接, 位置不对应, 从后面开始接上去!

两者都存在安全问题, 可能目标地的存储空间不够, 用strncpy, strncat, n 表示最多拷贝多少个进去

strncpy(s1,s2,n)

(5)strchr 在字符串中找字符, null 则没有找到

 

posted @ 2018-07-04 15:56  xy小崽子  阅读(751)  评论(0编辑  收藏  举报