字符串表示和字符串I/O

Posted x404

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串表示和字符串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);

以上是关于字符串表示和字符串I/O的主要内容,如果未能解决你的问题,请参考以下文章

标准I/O库 笔记

不理解大 O 表示法 O(∑ i=0 n−1 (∑ j=i+1 n (j−i)))=O(∑ i=0 n−1 2 (1+n−i)(n− i))=O(n^3)

Guava 9-I/O

[Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

在文件中查找字符串[重复]

I/O