zoukankan      html  css  js  c++  java
  • 字符串表示和字符串I/O

    字符串 character string 是以空字符(o)结尾的char数组,字符串使用的非常广泛

    比如常见的输入和输出

    #include<stdio.h>
    #define MA "****************"
    int main(void){
    int a;
    int a[]="xxxxxxxxxxxxxxxxxx";
    printf("aaaaaaaaaaaaa
    ");//这是Pirintf输出
    puts(MA);//puts 输出
    putchar('
    ');
    scnaf("%d",&a);
    printf("%d
    ",a);
    for(int i=0;,i<3;i++)puts(MA);}
    

     #define来定义字符串常量的,

    如果字符串文件中间没有间隔或者间隔的空格符,ANSIC会将其串联起来,比如:

    char gre[50]="hello,and"  "how are " "you " "today!";

    char gre[50]="hello ,and how are you today!"; 是相等的

     如果想在字符串中使用双引号,可以在双引号前加一个反斜线符号,如下所示:

    printf(""Run,Spot ,run!" exclaimed Dick . ");

    它的输出如下:

    "Run ,Spot,run!" exclaimed Dick.

    字符串常量属于静态存储(static storage)类 静态存储是指如果在一个函数中使用字符串常量,即使是多次调用这个函数,该字符串在程序的整个运行过程中只存储一份。整个引号中的内容作为指向该字符串存储位置的指针。这一点数组名作为指向数组存储位置的指针类似。

    #include<stdio.h>
    int main(void){
    printf("%s,%p,%c
    ","we","are",*"space farers");
    retrun 0;
    }
    

      %s格式将输入字符串we,%p 格式产生一个地址,因为如果“are”是个地址,那么%p应该输出字符串中第一个字符的地址(ANSI之前的现实中实现中可以用%u或者%lu而不是用%p),*"space farers"应该产生所指向的地址中的值,即字符串“space farers”的第一字符。

    下面是输出结果:

    we,0x004010,s

    数据与指针的差别

    初始化一个存在字符串的字符数组和初始化一个指向字符串的指针

    char heart[]="I Love tillie"
    char *head[]="I Love Millie"
    

      主要的差别在于数据名hear是常亮,而head是指针变量,首先它们都可以使用数组符号

    for(i=0;i<6;i++)
    putchar(hear[i]);
    putchar('
    ');
    for(i=0;i<6;i++)
    putchar(head[i]);
    putchar('
    ');
    

     运行结果:

    I Love

    I Love

    其次,两者都可以使用指针加法:

    for(i=0;i<6;i++)
    putchar(*(hear+i));
    putchar('
    ');
    for(i=0;i<6;i++)
    putchar(*(head+i));
    putchar('
    ');

    运行结果仍然是:

    I Love

    I Love

    只是只有指针可以使用增量运算符:

    while(*(head)!='')

    putchar(*(head++));

    产生如下结果:

    I Love Millie

    假定希望head与hear相同,可以这样做:

    head=hear;表示head指向数组hear

    这就使得head指针指向了数组hear,但是不能:

    hear=head;

    这情况类似于x=3和3=x;赋值语句的左边必须是一个变量或者更一般的说一个左值Value,head=hear 不会使head里面的Millie字符串消失,它的功能是改变了head中的存储地址,但是除非一再别处保存了millie的地方,否则当hear指向另一个地址是就没有办法访问这个字符串了。

    gets()函数:

    gets代表get string 函数对于交互式程序非常方便。它从系统的标准输入设备(通常是键盘)获得一个字符串。因为字符串没有预定的长度,所以gets()需要知道输入何时结束。解决办法是度字符串知道遇到一个换行符( ),按回车可以产生这个字符。它读取换行符之前(不包括换行符)的所有字符,在这些字符后添加一个空字符()),然后把字符串交给调用它的程序。它将去读换行符并将其丢弃,这样下次就会在新的一行开始。

    #define MAx 81
    char name[MAX];//分配空间
    printf("Hi ,what's your name?
    ");
    gets(name);//把字符串放进name中;
    printf("Nice name,%s.
    ",name);
    

      fgets()函数

    fgets()函数改进了多处回来的字符简单的一处道相邻的内存区这个问题,可以指定最大读入字符数。由于fgets()是为了文件Io而设计的。在处理键盘输入是就不如gets()那么方便。

    fgets()和gets()比较:

    fgets需要第二个参数来说明最大读入字符数,如歌这个参数值为n,fgets()就会读取最多n-1个字符或者读完一个换行府为止,这这两个最先满足的按个来结束输入

    如果fgets()读取道换行符,就会把它存到字符串里面,而不是将gets()那样丢弃

    fgets()需要第三个参数来说明读那个文件,从键盘上读数据时,可以使用stdin作为该参数,这个标识符在stdio.h中定义

    #include<stdio.h>
    #define Max 81
    int main(void ){
    char name[Max];
    char *ptr;
    puts("Hi,what's your name?
    ");
    ptr=fgets(name,Max,stdin);
    printf("%s? AH! %s!
    ",name,ptr);
    retrun 0;
    }
    

     运行后:

    Hi,what's you name?

    butns 

    butns

    ?AH! butns 

    !

    问题再付fgets()把换行存储道字符串里,这样每次显示字符串时就会显示换行符。

    由于fgets()函数不检查目标数组是否能够容纳输入,所以很不安全。

    字符串输出(put  fput printf)

    put()函数:只需要给出字符串参数的地址,

    #define DE"I am a  #defined string."
    int main(void){
    char str1[80]={An array was init  to me}
    const char *str2="A pointer was init to me"
    puts("I'm an argument to puts().");
    puts(DE);
    puts(str1);
    puts(str2);
    puts(&str[5]);
    puts(str2+4);
    }
    

     运行结果:

    I'm an argument to puts().
    I am a  #defined string.
    An array was init  to me
    A pointer was init to me
    ray was init  to me
    inter was init to me

    注意每个字符串都是单行显示,于printf()不同,puts()显示字符串时自动在其后添加一个换行符。
    表达式&str1[5]时数组str1的第6个元素第地址,这个元素包含字符‘r’,它正是puts()输出字符串的起点。
    str2+4 指向包含'i',的那个内存单元。puts()遇到空字符时他会停下来,所以应该确保空字符存在。

    fputs()函数
    fputs是gets的面向文件版本,
    fputs与puts区别:
    fputs需要第二个参数来说明要写的文件,可以使用stdout作为参数来进行输出显示,stdio.h定义
    与puts不同,fputs并不为输出自动添加换行符

    注意:gets()丢掉输入里的换行符,但是Puts()为输出添加换行符,fputs()不为输出添加换行符,fgets()存储输入中换行符。

    printf()函数
    printf()函数使用起来没有puts方便,但是它可以格式化多种数据类型,因而更通用
    printf("%s",string);等同于puts()函数
    虽然printf()函数缺乏灵活性,但是,printf("ius are %d, ius =%p ,ius=&p",name ,MS,MS);

  • 相关阅读:
    [转]Asp.Net 备份和恢复SQL SERVER 数据库
    alert 的封装
    using(sqlConnection conn=new sqlConnection) 中using的作用
    dotnet 上传大文件的配置的方法
    allowDefinition='MachineToApplication'
    转 Server Application Error报错信息的解决方案
    url 自动加入链接
    MVC中使用RadioButtonFor
    linux iptables squid 透明代理
    linux iptables网关配置,端口转发
  • 原文地址:https://www.cnblogs.com/X404/p/12182995.html
Copyright © 2011-2022 走看看