字符串表示和字符串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的主要内容,如果未能解决你的问题,请参考以下文章
不理解大 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)