zoukankan      html  css  js  c++  java
  • 字符串与字符串函数

    定义字符串的方法:
    1.字符串常量
    2.char数组 //这种方法数组名会看作首元素的地址的同义词,不可用++,增量运算符只能用于变量名前。 2.可以用*(head+1)这种格式 3.数组元素是变量,数组名是地址常量
    3.cahr指针 //是一个指针,是变量
    4.字符串数组

    举例:
    char character[23]= "fsdfdsf" "sdfdf";这是可以的


    //把字符串看作指针
    #include<stdio.h>
    int main(void)
    {
    printf("%s,%p,%c ","We","are",*"space farers");
    return 0;
    }


    const char m[] ={'d','d','' };//最后的标志结束的空格符不存在,就只是一个字符数组而不是一个字符串了

    一种特殊情况:
    #include<stdio.h>
    int main(void)
    {
    char * p1 = "Klingon";
    p1[0] = 'F';
    printf("Klingon");
    printf(": Beware the %ss! ","Klingon");

    }
    //编译器如果允许,可能会导致内存访问错误。编译器可能选择内存中的同一个单个的拷贝,来表示说有相同字符串的文字。意思就是说Klingon在内存中只存一份。
    //于是结果中所有Klingon都变成了Flingon


    字符串数组:
    const char *rt[3] = {"sdf","dfafads","dfsd"};
    rt实际上不存放字符串,它只是存放字符串的地址(字符串存在程序用来存放常量的那部分内存中)

    rt[0]看作表示第一个字符串,*rt[0]看作表示第一个字符串的第一个字符,也可以用rt[][];


    字符串输入首先要创建一个存储空间

    3种读取字符串的函数: scanf()、gets()、fgets()、


    1.gets()
    gets()会读取换行符之前(不包括换行符)的所有字符,在这些字符后添加一个空字符(''),然后把这个字符串交给调用它的程序。
    它将读取换行符并将其丢弃,这样下一次读取就会在新的一行开始。
    会返回字符串的地址

    它的原型构造:
    char *gets(char *s)
    {
    ....
    return (s);

    }

    返回的指针与传递给它的是同一个指针,输入字符串只有一个备份,放在作为函数参数传递过来的地址中。
    如果出错或遇到文件结尾,就返回一个空(或0)地址,此时什么都不会读

    错误检测:
    while(gets(name)!=NULL);


    while((ch = getchar())!=EOF);


    fgets()函数修正了gets()预留的存储区溢出的问题
    第二个参数指定最大读入字符数,如果参数为n,最多读入n-1个字符或读完一个换行符为止,读取到换行符会把它存到字符串内
    第三个参数说明读哪一个文件,可以用在stdio.h中定义的stdin作为参数

    ptr = fgets(name,MAX,stdin);//从键盘读数据

    strchr()来定位和删除换行符

    scanf常用来读取字符

    字符串的输出


    puts只要给出字符串参数的地址,会自动添加一个换行符,与gets()不读取换行符对应
    字符数组字符串的名字也被看作地址
    char str[] = "an apple";

    puts(&str[5]);
    puts(str);

    fputs()可以使用stdout作为参数来进行输出显示,fputs()并不为输出自动添加换行符,与fgets()读取换行符相对应

    printf()可以格式化多种数据类型,一行上输出多个字符串更加简单

    ANSI C 用头文件string.h给出这些函数的原型,之前是strings.h

    strlen()得到字符串的长度 strlen(string)
    strcat()将第二个字符串的一份拷贝添加到第一个字符串的结尾,返回第一个参数的值(char *)
    strncat(bugs,addon,13),中直到添加13个字符或遇到空字符为止
    strcmp()字符串参数相同就返回0,两个指针比较的话,只会比较两个字符串的地址,第一个在前为负,按机器编码顺序,一般是ASCII码,用关系运算符对字符进行比较
    可以用input[ct][0] != ''来检测空输入行
    strncmp()的第三个参数来指定比较的字符数

    strcpy() 例子: char word[4][5]; .... {strcpy(word[i],temp);i++}
    第一个参数可以不指向数组的开始


    strncpy(),如果源字符串还没结束就达到限制,就不会添加空字符。所以一般: strncpy(word[i],temp,num-1); word[i][num-1] = '';//下标是从0开始的

    sprintf()是在stdio.h中声明的,sprintf(formal,"%s,%d",last,num);//其中formal是数组


    ANSI C库一共有2多个处理字符串的函数。

    ctype.h应用于字符串的个别字符


    命令行参数:
    #include<stdio.h>
    int main(int argc,char *argv[])
    {
    int count;

    printf("The command line has %d arguments: ",argc-1);
    for(count = 1;count < argc; count++)
    printf("%d: %s ",count,argv[count]);
    printf(" ");

    }


    第一个参数时命令行中的字符串数,如repeat luoj (有两个,其中repeat是可执行文件名),argv【0】存放程序本身的名字,把随后的第一个字符串赋给argv[1].

    #include<stdio.h>
    #include<console.h>
    int main(int argc,char *argv[])
    {

    ...
    argc = ccommand(&argv);

    }

    Macintosh操作系统不使用命令行,可以用上面方法进行模拟

    字符串转化成其他类型:
    stdlib.h atoi();atof();atol(); strtol(),strtoul();strtod();

  • 相关阅读:
    逛画展
    数的划分
    有点难度的树链刨分
    树链刨分
    记502 dp专练
    数论相关
    模拟退火
    仓鼠找sugar
    NOIP 2017 解题报告
    整体二分
  • 原文地址:https://www.cnblogs.com/zxj-262410/p/6691246.html
Copyright © 2011-2022 走看看