第9章 字符串

  1. 字符串的输入与输出

int  ch;  char strings[80];  FILE *input;

(1)scanf(“%c”,&ch);   printf(“%c \n”,ch);    (输入字符串时自动添加\0

(2)ch = getchar();   putchar(ch);

(3)gets( strings );    puts( strings );      (输入字符串时自动添加\0

(4)fgets( strings, 80, stdin);    fputs( strings, stdout);

(5)fscanf (input, “%d %d”, &a , &b );

fprintf (input, “%d %d”, a , b );

(6)ch = getc ( input );   putc ( ch, input );

(7)sprintf() 主要针对字符串操作

1)数字字符串操作:sprinf( strings, “%d%d”,124,243); 产生字符串:124243

2)控制位,

sprintf(strings, “%f”,3.1415923); 产生:3.141593

3)连接字符串:在许多场合可以替代strcat()函数

char *who=”I”;  char *whom=”English”;

sprintf(strings, “%s love %s”,who, whom);

结果:I love English

4)返回本次函数调用最终打印到字符缓冲区的字符数目

    

     (8)sscanf() 可以从字符串中取出整数、浮点数和字符串等。

1)提取字符串:sscanf( “123456”, “%s”, strings);  strings: 123456

2)指定长度的字符串:sscanf( “123456”, “%4s”, strings);  strings: 1234

3)取到指定字符串为止的字符串

sscanf( “123456 abdcdef”, “%[^ ]”, strings);  strings: 123456

4)仅包含指定字符集的字符串:(取仅包含1-9和小写字母的字符串)

sscanf( “123456abdDJKJKELW”, “%[1-9a-z]”, strings);  strings: 123456abd

5)到指定字符集为止的字符串

sscanf( “123456abdDJKJKELW”, “%[^ A-Z]”, strings);  strings: 123456abd

2.复制: char  *strcpy ( char * dst, char const *src );  返回指向目标字符数组的指针,即dst。

3.连接char  *strcat ( char * dst, char const *src );  返回指向目标字符数组的指针,即dst。

4.;

5.长度受限字符串函数

(1)char  *strncpy( char *dst, char const *src, size_t len);  //若strlen(src)小于len,dst数组就用额外的NULL字节填充到len长度。

(2)char  *strncat( char *dst, char const *src, size_t len);

(3)int  strncmp( char const *s1, char const *s2, size_t len);

 

6.查找一个字符

(1)char  *strchr( char const *str, int ch);  //返回str中ch第一次出现的位置

(2)char  *strrchr( char const *str, int ch);  // 返回str中ch最后一次出现的位置

7.查找几个字符

char  *strpbrk (char const *str, char const *group);

返回str中第一个匹配group中任何一个字符的位置,若未找到匹配,返回NULL。

eg: char  string [20] = “ Hello there, honey.”;

char  *ans;

ans=strpbrk ( string , “aeiou”);

ans指向的位置都是string+1.

8.查找一个子串

char  *strstr ( char const *s1, char const *s2 );

在s1中查找s2次出现的起始位置,并返回指向该位置的指针。若s2是空,返回s1.

9.查找一个字符串前缀

size_t  strspn ( char const *str, char const *group );  //返回str起始部分匹配group中任意字符的字符数。

size_t  strcspn ( char const *str, char const *group);  //与strspn正好相反

eg:(1)

int  len1, len2;

char  buffer [] = “25,142,330,Smith,J,239-4123”;

len1=strspn ( buffer, “” );

len2=strspn ( buffer, “,0123456789” );

len1的值为,len2的值为

(2)

计算一个指向字符串中旳第一个非空白字符的指针:

ptr = buffer + strspn (buffer, “\n\r\f\t\v” );

10.查找标记

char  *strtok ( char *str, char const *sep );   

sep参数是个字符串,定义了用作分隔符的字符个或多个由sep中一个或多个分隔符分隔的标记。strtok找到str的下一个标记,并将其用NULL结尾,然后返回一个指向这个标记的指针。

11.C primer plus 11-7

  编写一个函数string_in(),它接受两个字符串指针参数。如果第二个字符串被包含在第一个字符串中,函数就返回被包含的字符开始的地址。例如,string_in("hats","at")返回hats中a的地址,则,函数返回空指针。在一个使用循环语句为这个函数提供输入的完整程序中进行测试。

#include <stdio.h>

char *string_in(char *p1, char *p2);

int main(void)

{

char str1[81];

char str2[21];

char *p;

do

{

puts("input range string:");

gets(str1);

puts("input match string:");

gets(str2);

p = string_in(str1, str2);

if ( p )

{

puts("Find!");

puts(p);

}

else puts("Can't find!");

puts("input any char except q to go on.");

gets(str1);

}

while(*str1 != 'q');

puts("Quit.");

return 0;

}

char *string_in(char *p1, char *p2)

{

char *p1_save = p1, *p2_save = p2;

if(*p1 == '\0' || *p2 == '\0') return NULL;

while(1)

{

if(*p1 == *p2)

{

 if(*++p2 == '\0') return p1_save;  //此时应用++p2

   if(*++p1 == '\0') return NULL;

 

}

else

{

if(*++p1 == '\0') return NULL;

 p1_save = p1;

,则p2指向首字母,重新在p1中寻找,p1从当前位置开始向后移动。

}

}

}

12.C primer plus 11-10

 

.编写一个程序,读取输入,直到读入了10个字符串或遇到EOF,由二者中最先被满足的那个终止读取过程。这个程序可以为用户提供一个有5个选项的菜单:输出初始字符串列表、按ASCII顺序输出字符串、按长度递增顺序输出字符串、按字符串中第一个单词的长度输出字符串和退出。菜单可以循环,直到用户输入退出请求。当然,程序要能真正完成菜单中的各项功能。

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define LINE 10

#define SIZE 81

void strinit(char *strings[],int num);

void strsrt(char *strings[],int num);

void strlong(char *strings[],int num);

void strwordlen(char *strings[],int num);

void menu();

int main()

{

char input[LINE][SIZE];

char *ptr[LINE];

int ct=0;

int choose;

printf("Input up to %d lines:\n",LINE);

while(ct<LINE && gets(input[ct])!=NULL && input[ct][0]!='\0')

{

ptr[ct]=input[ct];

ct++;

}

puts(" ");

puts("Please choose the way to sort: (1-5)");

menu();

printf("Please input your choice : ");

scanf("%d",&choose);

while(choose!=5)

{

switch(choose)

{

case 1:strinit(ptr,LINE);

break;

case 2:strsrt(ptr,LINE);

break;

case 3:strlong(ptr,LINE);

break;

case 4:strwordlen(ptr,LINE);

break;

default :break;

}

puts(" ");

puts("Please choose the way to sort: (1-5)");

menu();

printf("Your choice is : ");

scanf("%d",&choose);

}

return 0;

}

void menu()

{

puts("*******************************");

puts("1.输出初始化字符串列表.");

puts("2.按照ASCII顺序输出.");

puts("3.按照长度递增输出.");

puts("4.按字符串中第一个单词长度输出.");

puts("5.退出.");

puts("*******************************");

}

void strinit(char *strings[],int num)   //初始化字符串,并输出

{

for(int i=0;i<LINE;i++)

puts(strings[i]);

}

void strsrt(char *strings[],int num)    //按照首字母输出字符串

{

char *temp;

int top,seek;

for(top=0;top<num-1;top++)

for(seek=top+1;seek<num;seek++)

if(strcmp(strings[top],strings[seek])>0)

{

temp=strings[top];

strings[top]=strings[seek];

strings[seek]=temp;

}

/* for(int i=0;i<num;i++)

puts(strings[i]); */

strinit(strings,num);   //直接用strinit()

}

void strlong(char *strings[],int num)    //按照字符串长度输出字符串

{

int i,j;

char *temp;

for(i=0;i<num-1;i++)    //冒泡排序

for(j=0;j<num-1-i;j++)

{

if(strlen(strings[j])>strlen(strings[j+1]))

{

temp=strings[j];

strings[j]=strings[j+1];

strings[j+1]=temp;

}

}

//for( i=0;i<num;i++)

// puts(strings[i]);

strinit(strings,num);

}

void strwordlen(char *strings[],int num)   //按照首单词长度输出字符串

{

int i,j,flag;

int number[10];

char *temp;

for(i=0;i<num;i++)

{

j=0;

while(strings[i][j]!=' ' && strings[i][j]!='\n' && strings[i][j]!='\0')

j++;

number[i]=j;

}

for(i=0;i<num;i++)

printf("the number is : %d\n",number[i]);

for(i=0;i<num-1;i++)      //冒泡排序

for(j=0;j<num-1-i;j++)

{

//printf(" is : %d\n",number[j]);

//  printf("number is : %d\n",number[j+1]);

if(number[j]>number[j+1])

{

flag=number[j];              //没有这段代码时,无法进行字符串交换

number[j]=number[j+1];

number[j+1]=flag;

//只有number里面的数值进行了交换,才可以引导字符串进行交换,否则就是错误的

temp=strings[j];

strings[j]=strings[j+1];

strings[j+1]=temp;

}

}

strinit(strings,num);

}

13.C primer plus 11-12

编写一个程序,按照相反的单词顺序显示命令行参数。即,如果命令行参数是see you later,程序的显示应该为later you see

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

void reverse(char *input,char *output);

int main()

{

char input[80];             //input为指针常量,不能自加和自减

char *output;

output=(char *)malloc(sizeof(char *));   //很重要,指针变量不能自动分配存储空间

puts("Please input your strings:");

 fgets(input,80,stdin);

 

reverse(input,output);

puts("Now your strings are:");

puts(output);

return 0;

}

void  reverse(char *input,char *output)

{

char *pt;

pt=input;

while(*pt!='\0')     不能用while(*pt++!='\0');

pt++ ;

//   putchar(*pt++);

pt--;

for( int i=0; i<strlen(input) && pt>0; i++)

{

output[i]=*pt;

// putchar(output[i]);

pt--;

}

,若不加,会自行乱码填充

// puts(output);

}

char * reverse(char *input)   //这段代码错误原因就是局部变量在函数结束时内存已经收回,

{                       //无法将指针进行传递

char *pt,*tr,*pr;

int i=0,j=0;

pt=input;

while(*pt!='\0')

pt[i++];

tr=&pt[i-1];

putchar(*tr);

while(*tr!='\0')

{

pr[j++]=*tr--;

}

return pr;

}

14.fgets和scanf区别

char *string;    

char *pt;

string=(char *)malloc(sizeof(char *));

puts("Please input your string:");

scanf("%s",string);   // fgets(string,80,stdin);

pt=string;

while(*pt!='\0')

pt++;

pt=pt-1;     // pt=pt-2;

putchar(*pt);

用scanf(红色)输入时,输出最后一个字符只需pt-1,而用fgets(蓝色)输入时,输出最后一个字符必须用pt-2

第10章 动态内存分配

1.malloc()分配一块连续内存,返回一个指向被分配的内存块起始位置的指针。(stdlib.h)

2.free()参数必须是NULL,或者是从malloc、calloc或realloc返回的一个值。

   void  free(void  * pointer);

3.void  *malloc(size_t  size);

void  *calloc(size_t  num_elements,size_t  element_size);

malloc和calloc区别:

(1)malloc参数是需要分配的内存字节数,calloc参数是需要分配的元素个数和每个元素的长度。

(2)calloc在返回前把内存初始化为0,而malloc返回时内存并未以任何形式进行初始化。

4.realloc函数用于修改一个原先已经分配的内存块的大小。使一块内存扩大或缩小。

5.复制字符串

#include<stdio.h>

#include<string.h>

char  * strdup (char  const  *string)

{

char  *new_string;

new_string = malloc ( strlen (string ) + 1 );

if ( new_string != NULL )

strcpy( new_string, string );

return  new_string;

}

C和指针之学习笔记(4)的更多相关文章

  1. 02.C语言关于指针的学习笔记

    指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内 ...

  2. 《征服c指针》学习笔记-----统计文本单词数目的程序word_count

    1.程序的要求:对用户指定的英文文本文件(包括标准输入),将英文单词按照字母顺序输出到用户指定的文本文件中(包括标准输出),并且在各单词后面显示单词的出现次数. 2.模块设计: 主要分为:1.从输入流 ...

  3. &lt;深入理解C指针&gt;学习笔记和总结 第四章 指针和数组

    数组是一个什么玩意: 数组和指针我的理解,有同样之处也有不同之处.因有同样之处,因此一些资料上说,数组和指针本质是同样的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 同样之处: 数组名 ...

  4. C和指针之学习笔记(6)

    第17章 经典数据结构类型 堆栈 堆栈接口提供三种基本的操作:push.pop 和 top. Push:把一个新值压入到堆栈的顶部. Pop: 只把顶部元素从堆栈中移除,它并不返回这个值. Top: ...

  5. C和指针之学习笔记(5)

    第10章 使用结构和指针 单链表 typedef struct NODE { struct NODE *link; int value; } Node; 插入到一个有序单链表: #include< ...

  6. C和指针之学习笔记(3)

    第8章 数组 1.数组与指针 数组名是一个个元素的地址. int  a[10];  int  b[10];  int  *c; (1) c = & a[0]; &a[0]表示一个指向数 ...

  7. C和指针之学习笔记(2)

    第6章 指针 1.在一组字符串中查找字符: #include<stdio.h> #include<assert.h> #include<stdlib.h> #def ...

  8. C和指针之学习笔记(1)

    第1章 1.输入字符串 while((ch=getchar())!=EOF  &&  ch!=’\n’) ; ch=getchar() while(ch!=EOF  && ...

  9. C语言学习笔记之成员数组和指针

    成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下.     单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...

随机推荐

  1. Use of exceptionless, 作全局日志分布式记录处理

    Download latest release of exceptionless on github and deploy on Window server, by default exception ...

  2. 在Unity中实现屏幕空间反射Screen Space Reflection(2)

    traceRay函数 在上一篇中,我们有如下签名的traceRay函数 bool traceRay(float3 start, float3 direction, out float2 hitPixe ...

  3. HDU 3790 最短生成树 (最短路)

    题目链接 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. ...

  4. SPI协议及其工作原理浅析【转】

    转自:http://www.laoliu-soft.net/category/tech_chap/tech_linux/ 一.概述. SPI, Serial Perripheral Interface ...

  5. powerpc平台移植zebra或quagga-0.99.23

    1,先configure  ./configure   --enable-vtysh --disable-bgpd --disable-ripd --disable-ripngd --disable- ...

  6. java程序out of memory【转】

    相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问 ...

  7. java基础15 内部类(成员内部类、局部内部类)和匿名内部类

    一.内部类 1.1.1.成员内部类 一个类定义在另一个类的内部,那么该类就叫作成员内部类 1.1.2.成员内部类访问方式 方式一:在外部类中提供一个方法创建内部类的对象进行访问       方式二:在 ...

  8. Linux下快速查找文件

    1 locate 查找内容.查找数据库,updatedb命令更新数据库 2 which 命令 3 find 路径 -name 查找内容.find命令会磁盘查找,比较耗时. 4 grep 查找内容一般为 ...

  9. Codefroces 919D Substring(拓扑排序+DP)

    题目链接:http://codeforces.com/problemset/problem/919/D 题目大意:给你一张有向图,给你每个顶点上的字母和一些边,让你找出一条路径,路径上的相同字母数最多 ...

  10. free之后将指针置为NULL

    free一个指针,只是将指针指向的内存空间释放掉了,并没有将指针置为NULL,指针仍指向被释放掉的内存的地址,在判断指针是否为NULL的时候,通常是通过if(pt == NULL) ,这时,导致指针成 ...