十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
/*
成都地区优秀IDC服务器托管提供商(创新互联).为客户提供专业的德阳服务器托管,四川各地服务器托管,德阳服务器托管、多线服务器托管.托管咨询专线:13518219792
串a:
abcdefghijklmnopqrstuvwxyz
串b:
01234567890123456789
串a:
abcdefghijklmnopqrstuv012345678901234567
串c:
abcdefghijklmnopqrstuvwxyz
Press any key to continue
*/
#include stdio.h
#define MAXLEN 40
typedef struct {
char ch[MAXLEN];
int len;
}SString;
void StrInsert(SString *s,int pos,SString t) {
int i;
if(pos 0 ) pos = 0;
if(pos s-len - 1) pos = s-len;
if(s-len + t.len = MAXLEN) { // 长度适中
for(i = s-len + t.len - 1;i pos;i--)
s-ch[i] = s-ch[i - t.len];
for(i = 0;i t.len;i++) s-ch[i + pos] = t.ch[i];
s-len += t.len;
}
else if(pos + t.len MAXLEN) { // 长度超限1,从pos后不再有s的内容
for(i = pos;i MAXLEN; ++i)
s-ch[i] = t.ch[i - pos];
s-len = MAXLEN;
}
else { // 长度超限2,从pos + t.len后还有s的部分内容
for(i = MAXLEN - 1; i = pos + t.len; --i)
s-ch[i] = s-ch[i - t.len];
for(i = 0; i t.len; ++i)
s-ch[i + pos] = t.ch[i];
s-len = MAXLEN;
}
}
// 在s中从pos位置开始删除len个字符
int StrDelete(SString *s,int pos,int len) {
int i;
if(pos 0 || pos s-len) return 0;
if(pos + len s-len) { // 删除s的中间部分
for(i = pos;i pos + len;i++)
s-ch[i] = s-ch[i + len];
s-len -= len;
}
else { // len太大
s-len = pos;
}
return 1;
}
SString StrCopy(SString *s,SString t) {
int i;
for(i = 0;i t.len;i++) s-ch[i] = t.ch[i];
s-len = t.len;
return *s;
}
int StrEmpty(SString s) {
if(s.len == 0) return 1;
return 0;
}
int SteCompare(SString s,SString t) {
int i;
for(i = 0;i s.len i t.len;i++)
if(s.ch[i] != t.ch[i]) return (s.ch[i] - t.ch[i]);
return (s.len - t.len);
}
int SteLength(SString s) {
return s.len;
}
void StrClear(SString s) {
s.len = 0;
}
void StrShow(const SString s) {
int i;
for(i = 0; i s.len; ++i)
printf("%c",s.ch[i]);
printf("\n");
}
int main() {
SString stra = {"abcdefghijklmnopqrstuvwxyz",26};
SString strb = {"01234567890123456789",20},strc;
StrCopy(strc,stra);
printf("串a:\n");
StrShow(stra);
printf("串b:\n");
StrShow(strb);
StrInsert(stra,22,strb); //
printf("串a:\n");
StrShow(stra);
printf("串c:\n");
StrShow(strc);
return 0;
}
错误有:
1.if(t.ch) free(t.ch);有问题,因为t.ch没有赋初值,在主函数中应加上t.ch=NULL;
2.hstring *t;和Status strassign(hstring t,char *chars)调用t时形式不匹配,指针和引用,可改为:hstring t;或Status strassign(hstring *t,char *chars)
3.在strassign函数中的t.length=i;后加上t.ch[i]='\0';串结束标志。
4.strassign函数要有返回值。
你运行下面修改后的程序
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define MAXSTRLEN 256
#define MAXSTRSIZE 256
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef struct {char *ch;
int length;
}hstring;
Status strassign(hstring t,char *chars){
//生成一个其值等于串常量chars的串t
int i,j;
if(t.ch) free(t.ch);
i=strlen(chars);
if(!i) { t.ch=NULL; t.length=0; }
else{
if(!(t.ch=(char *)malloc(i*sizeof(char))))
exit(OVERFLOW);
for(j=0;ji;j++)
t.ch[j]=chars[j];
t.length=i;
t.ch[i]='\0';
}
return TRUE;
}
void main()
{ hstring t;
int i;t.ch=NULL;
char s[80]="vamos argentina.\n";
strassign(t,s);//32行
for(i=0;t.ch[i]!='\0';i++) printf("%c",t.ch[i]);}//33行
(如果I和m之间只有一个'号,没有空格的话)
长度应该为13
SubString(s1,8,5)的结果是tuden,(意思是说从第8个字符开始,拿出5个字符)
index(s1,'u')的功能是在字符串中s1查找目的字符u,如果找到了,就返回u的位置值,没有找到就返回0。s1中有u这个字符,位置为9,所以结果为9
Replace(s1,’stidemt’,s3) 格式有问题;
replace(s,start,t,v),即要求在主串s中,从位置start,开始查找是否存在子串t,若主串s中存在子串t,则用子串v替换子串t 且函数返回1,若主串s中不存在子串t,则函数返回0.
string.h头文件中包含的字符串函数
void *memcpy(void *dest, const void *src, size_t n);//将n字节长的内容从一个内存地址复制到另一个地址;如果两个地址存在重叠,则最终行为未定义
void *memmove(void *dest, const void *src, size_t n);//将n字节长的内容从一个内存地址复制到另一个地址;与memcpy不同的是它可以正确作用于两个存在重叠的地址
void *memchr(const void *s, char c, size_t n);//在从s开始的n个字节内查找c第一次出现的地址并返回,若未找到则返回NULL
int memcmp(const void *s1, const void *s2, size_t n);//对从两个内存地址开始的n个字符进行比较
void *memset(void *, int, size_t);//用某种字节内容覆写一段内存空间
char *strcat(char *dest, const char *src);//在字符串dest之后连接上src
char *strncat(char *dest, const char *src, size_t n);//从src截取n个字符连接在字符串dest之后,返回dest字符串
char *strchr(const char* str, int ch);//从字符串str头开始查找字符ch首次出现的位置
char *strrchr(const char* str,int ch);//从字符串str尾开始查找字符ch首次出现的位置
int strcmp(const char *, const char *);//基于字典顺序比较两个字符串
int strncmp(const char *, const char *, size_t);//基于字典顺序比较两个字符串,最多比较n个字节
int strcoll(const char *, const char *);//基于当前区域设置的字符顺序比较两个字符串
char *strcpy(char* str1, const char* str2);//将str2拷贝给str1
char *strncpy(char* str1, const char* str2, size_t n);//截取str2的n个字符拷贝给str1
char *strerror(int);//返回错误码对应的解释字符串,参见errno.h(非线程安全函数)
size_t strlen(const char *);//返回一个字符串的长度
size_t strspn(const char *s, const char *strCharSet);//从字符串s的起始处开始,寻找第一个不出现在strCharSet中的字符,返回其位置索引值。换句话说,返回从字符串s的起始位置的完全由strCharSet中的字符构成的子串的最大长度。strspn为string span的缩写。不支持多字节字符集。
size_t strcspn(const char *s, const char *strCharSet);//从字符串s的起始处开始,寻找第一个出现在strCharSet中的字符,返回其位置索引值。换句话说,返回从字符串s的起始位置的完全由不属于strCharSet中的字符构成的子串的最大长度。strcspn为string complement span的缩写。不支持多字节字符集。
char *strpbrk(const char *s, const char *strCharSet);//在字符串s中查找strCharSet中任意字符第一次出现的位置的指针值。strpbrk为string pointer break缩写。不支持多字节字符集。
char *strstr(const char *haystack, const char *needle);//在字符串haystack中查找字符串needle第一次出现的位置,heystack的长度必须长于needle
char *strtok(char *strToken, const char *strDelimit );//将一个字符串strToken依据分界符(delimiter)分隔成一系列字符串。此函数非线程安全,且不可重入;但MSVC实现时使用了thread-local static variable因而是线程安全的单仍然是不可重入,即在单线程中不能对两个源字符串交替调用该函数来分析token,应当对一个字符串分析完成后再处理别的字符串。
size_t strxfrm(char *dest, const char *src, size_t n);//根据当前locale转换一个字符串为strcmp使用的内部格式