MOOC——C语言10:字符串

1.字符串的-指针和数组的区别:

char * str = "hello";
char word[] = "hello";

字符串指针默认为const的(即 const char *),所以只读不可写,(其实具体点是,不能通过str修改"hello"的值,原因见 九章指针与const)。str是一个指针,初始化为指向一个字符串常量。

如果需要修改字符串,应该用数组。

如果要构造一个字符串->数组,

如果要处理一个字符串->指针。

#include<stdio.h>
#include<string.h>
void a_c(char []);
void a_p(char *);
int main()
{
    char a[]="i'm ok~";
     
    printf("%s\n",a);
    a_c(a);
    printf("%s\n",a);
    a_p(a);
    printf("%s",a);
     
/*  指针不可写,error 
    char *b="error";
    printf("%s\n",b);
    a_c(b);
    printf("%s\n",b);
    a_p(b);
    printf("%s",b);
*/ 
    return 0;
}
void a_c(char a[]){
    int i=strlen(a),j=0;
    while(j<i){
        a[j]+=1;
        j++;
    }
 
}
void a_p(char *a){
    int i=strlen(a),j=0;
    while(j<i){
        a[j]-=1;
        j++;
    }
 
}

这么实验的,对于char * 和char []参数,都是可写的,只要定义的时候是数组就好。时间匆忙,技术有限,不求甚解。

2.字符串输入输出:

	char string[8];
	scanf("%s",string);	
	printf("%s",string);

scanf读入一个单词(到空格、tab或回车为止)。 //艾玛,原来可以这么输入的。

但这么输入是不安全的,因为没有检测是否越界。可以修改一下:

<span style="white-space:pre">	</span>scanf("%7s",string);  //最多读取7个字符啦啦啦~

在%和s之间的数字表示最多允许读入的字符数量,这个数字应该比数组大小小一。//因为要给'\0'留位子。

3.字符串数组:

char a[][10]={"hello.","cat cat"};

char *a[]={"hello.","cat cat"};

4.字符串处理函数  <string.h>

strlen 返回字符串的长度(不包括结尾0)

size_t mystrlen(const char *s){
	int idx=0;
	while(s[idx] != '\0')
		idx++;
	return idx;
} 

strcmp 比较两个字符串,相等返回0,s1>s2,返回差值(正数),s1<s2,返回差值(负数).

int mystrcmp(const char * s1,const char * s2){
	int idx=0;

	/*
    
	while(1){
		if(s1[idx] != s2[idx])
			break;
		else if(s1[idx] == '\0')
			break;
		idx++;
	}
	*/
	//改进版
	while(s1[idx] == s2[idx]  &&  s1[idx]!='\0')
		idx++; 
	
	return s1[idx] - s2[idx];
}

strcpy 把第二个字符串拷贝到第一个字符串。  复制字符串:char *dst = (char *)malloc(strlen(src)+1);    strcpy(dst,src);

char * mystrcpy(char* dst,const char* src){
	int idx=0;
	while(src[idx]){  //src[idx] != '\0'
		dst[idx]=src[idx];
		idx++;
	}
	dst[idx]='\0'; 
	return dst;
}

strcat 把s2连接到s1后面,连接成一个长字符串。

char * mystrcat(char *s1,const char *s2){  //这个是标准库=。=
	 char * cp = s1;
        while( *cp )
            cp++;                  
        while( *cp++ = *s2++ ) ;      
    return s1;                
}

strchr 字符串中查找字符,返回此字符开始的指针。

strstr 字符串中找字符串。


p.s.

'\0'和0等价,即

char s[10]={'h','e','l','\0','l','o'};
char s[10]={'h','e','l',0};

是等价的噢。

10-0. 说反话

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。

输出格式:每个测试用例的输出占一行,输出倒序后的句子。

输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
#include <stdio.h>
#include <string.h>
int main(){
	const int max = 100;
	char s[max][max];
	int i,j,c='x';
	for(i=0;i<max & c!='\n' ;++i){
		for(j=0;j<max & (c=getchar())!='\n';++j){
			if(c==' '){
				s[i][j]='\0';
			//	printf("i=%d\n",i);
				break;
			}
			else 
				s[i][j]=c;
		//	printf("%c",c);
		}
	}
	
	s[--i][j]='\0'; //最后回车会使得i多加了一次,所以这里减去。 
	//printf("i=%d\n",i);
	while(i){   //这里不会输出i==0。所以下面补上 
		printf("%s ",s[i]);
		--i;
	}
	printf("%s",s[0]);

	return 0;
}

10-1. 在字符串中查找指定字符

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)

输入一个字符串S,再输入一个字符c,要求在字符串S中查找字符c。如果找不到则输出“Not found”;若找到则输出字符串S中从c开始的所有字符。

输入格式:

输入在第1行中给出一个不超过80个字符长度的、以回车结束的非空字符串;在第2行中给出一个字符。

输出格式:

在一行中按照题目要求输出结果。

输入样例1:
It is a black box
b
输出样例1:
black box
输入样例2:
It is a black box
B
输出样例2:
Not found
#include <stdio.h>
void squeeze(char ,char[]);
int main(){
	const int max = 90;
	char s[max];
	int i,c;
	for(i=0;i<max-1 && (c=getchar())!='\n';++i){
		s[i]=c;
	}
	s[i]='\0';
	char a;
	a=getchar();
	squeeze(a,s);
	return 0;
}

void squeeze(char c,char s[]){
	int i,j,b=0;
	for(i=j=0; s[i]!='\0';++i){
		if(s[i]==c)
			b=1;
		if(b==1)
			s[j++]=s[i];
	}
	s[j]='\0';
	if(b==1)
		printf("%s\n",s);
	else 
		printf("Not found\n");
}

10-2. 删除字符串中的子串

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。

输入格式:

输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。

输出格式:

在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male 

#include <stdio.h>
#include <string.h>
int strdelstr( char *, char *);

int main(){
	//char s1[]="tomcat is male ccatat";
	//char s2[]="cat";
	const int max=90;
	char s1[max];
	char s2[max];
	int i,c;
	for(i=0;i<max-1 && (c=getchar())!='\n';++i){
		s1[i]=c;
	}
	s1[i]=0;
	
	for(i=0;i<max-1 && (c=getchar())!='\n';++i){
		s2[i]=c;
	}
	s2[i]=0;
	
	
	int a;
	do{
		a=strdelstr(s1,s2);
	}while(!a);
	
	printf("%s",s1);


	return 0;
}

int strdelstr(char s1[],char s2[]){
	int i,j,k,R=1;  //R为返回标志,为1代表未修改。0代表修改过,就还得再检测一次。 
	int len=strlen(s2);
	for(i=j=0;s1[i]!=0;++i){
	
			int n=i,k=0;
			int len2=0;
			while(s1[n]==s2[k] && s2[k]!=0 ){
				len2++;
				k++;
				n++;
			}
			if(len2==len) {
				i+=len;
				R=0;
			}
			len2=0;
		
			s1[j++]=s1[i];
	}
	s1[j]='\0';
	return R;
}

10-3. 字符串逆序

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

输入格式:

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

输出格式:

在一行中输出逆序后的字符串。

输入样例:
Hello World!
输出样例:
!dlroW olleH
#include <stdio.h>
#include <string.h>
void reverse(char []) ;
int main(){
	const int max=90;
	char s[max];
	gets(s);
	reverse(s);
	printf("%s\n",s);
	
	return 0;
}

void reverse(char s[]){
	int c,i,j;
	for(i=0,j=strlen(s)-1; i<j;i++,j--){
		c=s[i];
		s[i]=s[j];
		s[j]=c;
	}
} 

10-4. 字符串循环左移

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
白洪欢(浙江大学)

输入一个字符串和一个非负整数N,要求将字符串循环左移N次。

输入格式:

输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。

输出格式:

在一行中输出循环左移N次后的字符串。

输入样例:
Hello World!
2
输出样例:
llo World!He
#include <stdio.h>
#include <string.h>
const int max=120;
void left(char [],int);
void my_getline(char []);
int main(){
	char s[max];
	int n;
	my_getline(s);
//	fflush(stdin);
	scanf("%d",&n);
	if(n>0)
		left(s,n); 
	printf("%s\n",s);
	return 0;
}
void left(char s[],int n){
	int len=strlen(s),i;
//	printf("%d\n",len);
	while(n--){
		char a=s[0];
		for(i=1;i<len;++i){
			s[i-1]=s[i];
			
		}
		s[--i]=a;
	
	}

	s[++i]='\0';

}
void my_getline(char s[]){
	int i;
	char c;
	for(i=0;i<max-1 && (c=getchar())!='\n';++i){
		s[i]=c;
	}
	s[i]=0;
}


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MOOC翁凯C语言期末考试是一项对学生在C语言编程方面的掌握程度行综合评估的考试。在这次考试中,学生将会面对一系列与C语言相关的问题和编程题目。 首先,考试将会涉及C语言的基础知识,包括变量定义、运算符使用、流程控制和函数的使用等。学生需要对这些内容有清晰的理解和掌握,能够正确地应用于实际的编程问题中。 其次,考试还将要求学生能够分析和解决一些较为复杂的编程问题。这些问题可能涉及到数组、指针、结构体等高级数据结构和算法的使用。学生需要能够理解并正确应用这些概念,以解决给定的编程问题。 此外,考试可能会涉及一些C语言程序的输出结果预测和错误调试等内容。学生需要具备对C语言的程序执行过程有清晰的认识,能够正确预测程序输出结果,并有能力发现和纠正程序中的错误。 最后,考试还可能会包括一些编程题目,要求学生能够根据题目要求独立编写C语言程序。在这些题目中,学生需要展示自己的编程能力和解决问题的能力,用C语言实现要求的功能,并保证程序的正确性和健壮性。 综上所述,MOOC翁凯C语言期末考试是一次对学生在C语言编程方面的综合能力行考察的考试。学生需要掌握C语言的基础知识,具备解决编程问题的能力,并能够独立完成一定的编程任务。该考试将帮助学生提升在C语言编程方面的能力,并为将来在计算机编程领域的学习和工作奠定坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值