C和指针之学习笔记(4)
第9章 字符串
- 字符串的输入与输出
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)的更多相关文章
- 02.C语言关于指针的学习笔记
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内 ...
- 《征服c指针》学习笔记-----统计文本单词数目的程序word_count
1.程序的要求:对用户指定的英文文本文件(包括标准输入),将英文单词按照字母顺序输出到用户指定的文本文件中(包括标准输出),并且在各单词后面显示单词的出现次数. 2.模块设计: 主要分为:1.从输入流 ...
- <深入理解C指针>学习笔记和总结 第四章 指针和数组
数组是一个什么玩意: 数组和指针我的理解,有同样之处也有不同之处.因有同样之处,因此一些资料上说,数组和指针本质是同样的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 同样之处: 数组名 ...
- C和指针之学习笔记(6)
第17章 经典数据结构类型 堆栈 堆栈接口提供三种基本的操作:push.pop 和 top. Push:把一个新值压入到堆栈的顶部. Pop: 只把顶部元素从堆栈中移除,它并不返回这个值. Top: ...
- C和指针之学习笔记(5)
第10章 使用结构和指针 单链表 typedef struct NODE { struct NODE *link; int value; } Node; 插入到一个有序单链表: #include< ...
- C和指针之学习笔记(3)
第8章 数组 1.数组与指针 数组名是一个个元素的地址. int a[10]; int b[10]; int *c; (1) c = & a[0]; &a[0]表示一个指向数 ...
- C和指针之学习笔记(2)
第6章 指针 1.在一组字符串中查找字符: #include<stdio.h> #include<assert.h> #include<stdlib.h> #def ...
- C和指针之学习笔记(1)
第1章 1.输入字符串 while((ch=getchar())!=EOF && ch!=’\n’) ; ch=getchar() while(ch!=EOF && ...
- C语言学习笔记之成员数组和指针
成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下. 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...
随机推荐
- selenium.common.exceptions.ElementNotVisibleException: Message: element not visible处理方法:selenium针对下拉菜单事件的处理
使用Selenium爬虫时,可能会遇到一些下拉菜单,动态加载,如果直接使用find_element_by_函数会报错,显示selenium.common.exceptions.ElementNotVi ...
- 搭建简单的node+express+mongodb项目
安装 首先要确保已经安装了 Node.js,接下来创建一个目录,然后进入此目录并将其作为当前工作目录. mkdir myapp cd myapp 通过 npm init 命令为应用创建一个 packa ...
- 【洛谷 P4542】 [ZJOI2011]营救皮卡丘(费用流)
题目链接 用最多经过\(k\)条经过\(0\)的路径覆盖所有点. 定义\(ds[i][j]\)表示从\(i\)到\(j\)不经过大于\(max(i,j)\)的点的最短路,显然可以用弗洛伊德求. 然后每 ...
- 从INT_MAX和INT_MIN看补码
刷一道题的时候遇到INT_MAX和INT_MIN的问题,有些东西忘了,梳理一下. INT_MAX为2147483647,INT_MIN为-2147483648,为什么MIN的绝对值比MAX多1呢,因为 ...
- npm的常用命令
npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...
- 零基础讲解JavaScript函数
一 JavaScript函数1 什么是函数 函数是一组代码(指令)的集合,通常用来完成某个单一的功能.(书的目录和章节,电视剧剧集的名称等)2 为什么要使用函数 2.1 把复杂程序划分成不同的功能 ...
- Perl6多线程2: Promise new/keep/bread/status/result
来源于个人理解的翻译. 创建一个 promise: my $p = Promise.new; 可以打印运行 的Promise 状态: my $p = Promise.new(); $p.then({s ...
- PHP 结合实例认识 Socket
一.简介 (本部分参考自 揭开Socket的神秘面纱 - 源码工作室) 请结合下图 Socket 抽象层的位置来理解.Socket 是应用层和 TCP/IP 协议族进行通信的中间软件抽象层,是一组接口 ...
- dev_alloc_skb(len+16) skb_reserve(skb,2) skb_put(skb,len)
/** * dev_alloc_skb - allocate an skbuff for receiving * @length: length to allocate * * ...
- shell脚本自带变量的含义
$0 Shell本身的文件名 $1-$n 添加到Shell的各参数值.$1是第1参数.$2是第2参数… $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process ...