字符串数组
初始化方式
#include <stdio.h>
#include <string.h>
int main(){
/*方式一*/
char string1[20]={'\0'};//常用初始化
printf("strig1:%s\n",string1);//%s输出字符串,自动读到'\0'结束
/*方式二*/
char string2[]={'H','e','l','l','\0','o'};//不推荐,不给确定大小则最终大小以后面括号内容决定,且不自动加'\0'
printf("strig2:%s,size:%d\n",string2,sizeof(string2)); //strig2:Hell,size:6
/*方式三*/
char string3[20]="";//直接空字符串初始化,不推荐
printf("please input:");
scanf("%s",string3);//遇到空格和回车停止,其余内容仍在缓存中
while(getchar()!='\n');//清缓存一定要在上一个输出之后清除,免得出现异常
printf("strig3:%s\n",string3);
/*方式四*/
char string4[100]="hello world";
/*方式五*/
char string5[1024];
memset(string5,0,sizeof(string5));//因为是字符,所以还可以写成memset(string5,0,1024);
printf("please input:");
gets(string5);//整行的输入
printf("string5:");
puts(string5);//puts无法做到像printf那样的输出效果
}
题1 交换大小写,按ASCII码排序
#include <stdio.h>
#include <string.h>
#define SIZE 25
void string_output(char *);
void string_pick(char *p);
void string_sort(char *p);
void swap(char *p1,char *p2);
int main(int argc, char **argv)
{
char string[SIZE]={'\0'};
printf("请输入%d个字符串:",SIZE);
//gets(string); //不限制输入字符个数,会有越界操作的风险出现段错误,推荐使用fgets()
fgets(string,SIZE,stdin);//会读入最后的换行符'\n'
printf("输入的字符串为:");
string_output(string);
printf("大小写互换后的字符串为:");
string_pick(string);
string_output(string);
printf("按ASCII码排序后的字符串为:");
string_sort(string);
string_output(string);
return 0;
}
void string_output(char *p){
for(int i=0;i<strlen(p)-1;++i)printf("%c",p[i]); // i<strlen(p)-1 去掉输入数组末尾的'\n'换行符
printf("\n");
}
#if 0
void string_pick(char *p){
/*将大小写和数字分开放置输出*/
char number[1024]={'\0'},big[1024]={'\0'},small[1024]={'\0'};
int i=0,num_index=0,big_index=0,small_index=0;
for(i=0;i<SIZE;++i){
if(p[i]>='0'&&p[i]<='9')number[num_index++]=p[i];
else if(p[i]>='a'&&p[i]<='z')big[big_index++]=p[i];
else if(p[i]>='A'&&p[i]<='Z')small[small_index++]=p[i];
}
string_output(number);
string_output(big);
string_output(small);
}
#endif
#if 1
void string_pick(char *p){
/*将小写字母变大写或相反*/
int i=0;
for(i=0;i<strlen(p);++i){
if(p[i]>='a'&&p[i]<='z')p[i]-=32;
else if(p[i]>='A'&&p[i]<='Z')p[i]+=32;
}
}
#endif
#if 1
void string_sort(char *p){
/*按ASCII码排序*/
int i=0,j=0;
for(i=0;i<strlen(p)-1;++i){
for(j=0;j<strlen(p)-2;++j)
if(p[j]>p[j+1])swap(&p[j],&p[j+1]);
}
}
void swap(char *p1,char *p2){
char temp;
temp=*p1;*p1=*p2;*p2=temp;
}
#endif
优化fgets函数
void mygetstr(char*);
void mygetstr(char*str){
int len;
printf("请输入一个字符串:");
while(1){
fgets(str,SIZE,stdin);
if(*str=='\n'){
printf("没有输入!请重新输入:");continue;
}
break;
}
len=strlen(str);
if(str[len-1]=='\n')str[len-1]='\0'; //去掉fgets输入的'\n'
else while(getchar()!='\n');
return len-1; //返回长度
}
题2:从键盘输入的一行字符,统计其中单词的个数。假设单词之间以非英文字符为分隔
/*2021-04-02
* 题1:从键盘输入的一行字符,统计其中单词的个数。假设单词之间以非英文字符为分隔
示例:
请输入一个字符串:do you love me?
输入字符串中有4个单词。
*/
#include <stdio.h>
#include <string.h>
#define SIZE 20
void mygetstr(char*);
int words(char*);
int adj(char ch);
int main(int argc, char **argv)
{
char str[SIZE]={'\0'};
mygetstr(str);
printf("输入字符串中有%d个单词。\n",words(str));
return 0;
}
void mygetstr(char*str){
int len;
printf("请输入一个字符串:");
while(1){
fgets(str,SIZE,stdin);
if(*str=='\n'){
printf("没有输入!请重新输入:");continue;
}
break;
}
len=strlen(str);
if(str[len-1]=='\n')str[len-1]='\0'; //去掉fgets输入的'\n'
else while(getchar()!='\n');
}
int words(char*s){
/*查找单词,若是字母则判断后一位是不是非字母,若是则判断为单词,若不是则继续判断*/
char*p;
int count=0;
for(p=s;*p!='\0';p++){
if(adj(*p)){
if(!adj(*(p+1)))count++;
}
}
return count;
}
int adj(char ch){
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))return 1;
else return 0;
}
题3:用户输入一行字符串,统计此字符串中每一个小写字母出现的次数
/*2021-04-02
* 用户输入一行字符串,统计此字符串中每一个小写字母出现的次数
input a string: abckckchcAD
a:1
b:1
c:4
h:1
k:2
*/
#include <stdio.h>
#include <string.h>
#define SIZE 20
int count(char*s,char i);
void mygetstr(char*str);
int main(int argc, char **argv)
{
char s[SIZE]={'\0'};
mygetstr(s);
char i;int num=0,inter=0;
for(i='a';i<='z';i++)
if((num=count(s,i))){printf("%c有%d个\n",i,num);inter++;}
if(!inter)printf("字符串里没有小写字母!\n");
return 0;
}
int count(char*s,char i){
char*p;
int count=0;
for(p=s;*p!='\0';p++){
if(*p==i)count++;
}
return count;
}
void mygetstr(char*str){
int len;
printf("请输入一个字符串:");
while(1){
fgets(str,SIZE,stdin);
if(*str=='\n'){
printf("没有输入!请重新输入:");continue;
}
break;
}
len=strlen(str);
if(str[len-1]=='\n')str[len-1]='\0'; //去掉fgets输入的'\n'
else while(getchar()!='\n');
}
题4:自定义函数实现 strlen strcpy strcat strcmp
/*文件名:strfunc.h*/
/*strlen
* 求字符串长度*/
int strlength(char *s1);
/*strcpy
* 将s2复制给s1*/
char *strcopy(char *s1, char *s2);
/*strcat
* 将s2加到s1末尾*/
char *strconnect(char *s1, char *s2,int size);
/*strcmp
* 比较两字符串大小*/
int strcompare(char *s1, char *s2);
==============================
/*文件名:strfunc.c*/
/* 自定义函数实现 strlen strcpy strcat strcmp
*/
#include "strfunc.h"
/*strlen
* 求字符串长度*/
int strlength(char *s1){
int num=0;
for(; *s1; s1++, num++) ; //num加加直到s1为空结束,不记入空
return num;
}
/*strcpy
* 将s2复制给s1*/
char *strcopy(char *s1, char *s2){
char *p1, *p2;
for(p1=s1,p2=s2; (*p1=*p2); //每次赋值之后再判断是否为空,直到p2将空值赋给p1后结束
p1++,p2++); //每次指针加1
return s1;
}
/*strcat
* 将s2加到s1末尾*/
char *strconnect(char *s1, char *s2, int size){
char *p1, *p2;
p1=s1; while(*p1)p1++;
for(p2=s2; (p1<(s1+size)&&(*p1=*p2)); p1++,p2++);
return s1;
}
/*strcmp
* 比较两字符串大小*/
int strcompare(char *s1, char *s2){
char *p1,*p2; p1=s1,p2=s2;
do{ if(*p1!=*p2) return (*p1>*p2);}
while(++p1,++p2,*p1||*p2); //当两个指针都到末尾空时退出,为相等
return -1;
}
============================================
/*文件名:strfunc_test.c*/
#include <stdio.h>
#include "strfunc.h"
#define SIZE 30
void compare(char *s1,char *s2);
int main(){
char *s1= "hallo morning";
char s2[SIZE] = {'\0'}; //字符数组的初始化定义
printf("=%s= len:%d \n", s1, strlength(s1) );
printf("s2: %s \n", strcopy(s2, s1));
compare(s1,s2);
printf("s2+s1: %s \n", strconnect(s2, s1,SIZE));
printf("s2++s1: %s \n", strconnect(s2, s1, SIZE));
printf("s2+++s1: %s \n", strconnect(s2, s1,SIZE));
printf("s2++++s1: %s \n", strconnect(s2, s1,SIZE));
compare(s1,s2);
printf("s1:%s\ns2:%s\n",s1,s2);
printf("after copy, s2: %s \n", strcopy(s2, s1));
compare(s1,s2);
}
void compare(char *s1,char *s2){
if(strcompare(s2, s1)==0)printf("s2<s1 \n");
if(strcompare(s2, s1)>0)printf("s2>s1 \n");
if(strcompare(s2, s1)<0)printf("s2=s1 \n");
}
===========================================
输出:
=hallo morning= len:13
s2: hallo morning
s2=s1
s2+s1: hallo morninghallo morning
s2++s1: hallo morninghallo morninghall
s2+++s1: hallo morninghallo morninghall
s2++++s1: hallo morninghallo morninghall
s2>s1
s1:hallo morning
s2:hallo morninghallo morninghall
after copy, s2: hallo morning
s2=s1