给定S和T两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。#代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
用栈做吧
#include <stdio.h>
#include <string.h>
int main() {
char S[100], T[100];
int i, j;
int len1, len2;
printf("请输入字符串S:");
scanf("%s", S);
printf("请输入字符串T:");
scanf("%s", T);
len1 = strlen(S);
len2 = strlen(T);
if (len1 != len2) {
printf("两个字符串不相等\n");
return 0;
}
for (i = 0; i < len1; i++) {
if (S[i] != T[i] && S[i] != '#') {
printf("两个字符串不相等\n");
return 0;
}
}
printf("两个字符串相等\n");
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:/* **************************
编写程序,定义函数 void insert(char *s, char *t, int pos) 将字符串t插入到
字符串s中,插入位置为pos。假设分配给字符串s的空间足够让字符串t插入。
*************************** */
#include <stdio.h>
#include <string.h>
#define MAXLEN 40
#define FALSE 0
#define OK 1
//定义顺序串1
typedef struct {
char ch1[MAXLEN];
int len1;
} SString1;
//定义顺序串2
typedef struct {
char ch2[MAXLEN];
int len2;
} SString2;
//插入
int Insert(SString1 *s, SString2 t, int pos) {
int i;
if (pos < 0 || pos > s->len1) {
printf("\t插入位置不合法!");
return FALSE;
}
if (s->len1 + t.len2 <= MAXLEN) { //插入后串长<=MAXLEN
for (i = s->len1 + t.len2 - 1; i >= t.len2 + pos; i--)
s->ch1[i] = s->ch1[i - t.len2];
for (i = 0; i < t.len2; i++)
s->ch1[i + pos] = t.ch2[i];
s->len1 = s->len1 + t.len2;
} else if (pos + t.len2 <= MAXLEN) { //插入后串长>MAXLEN,但串t的字符序列可以全部插入
for (i = MAXLEN - 1; i > t.len2 + pos - 1; i--)
s->ch1[i] = s->ch1[i - t.len2];
for (i = 0; i < t.len2; i++)
s->len1 = MAXLEN;
} else { //插入后串长>MAXLEN,并且串t的部分字符也要舍弃
for (i = 0; i < MAXLEN - pos; i++)
s->ch1[i + pos] = t.ch2[i];
s->len1 = MAXLEN;
}
printf("%s", s->ch1);
return OK;
}
//主函数
int main() {
SString1 s;
SString2 t;
int pos;
printf("请输入字符串s:");
scanf("%s", s.ch1);
s.len1 = strlen(s.ch1);
printf("请输入字符串t:");
scanf("%s", t.ch2);
t.len2 = strlen(t.ch2);
printf("请输入想插入字符串s的位置:");
scanf("%d", &pos);
Insert(&s, t, pos - 1);
return 0;
}
经过与Chat GPT的进一步沟通,问题已经被明确为字符串比较相等性问题。在比较两个字符串相等性时,需要解决的是其中含有“#”(表示删除键)的情况。请看下面的程式实现,其中比较字符串相等性的算法是用指针逐个比较每个字符是否相等。具体步骤如下:
定义函数char DeleteChar(char s)。
char DeleteChar(char s)的功能是删除字符串 s 中一个字符。如果最后一个字符是删除键,直接删除;否则将字符串最后一个字符设置为空字符。
定义函数int CompareString(char s, char t)。其中,参数 s 和 t 分别表示要比较的两个字符串。
int CompareString(char s, char t) 的功能是比较字符串 s 和字符串 t 是否相等,其中 s 和 t 中都可能含有删除键“#”。
在函数 CompareString 中,定义指针 p 和 q,初始化为 s 和 t。
如果 p 和 q 指向的字符都是空字符,则两个字符串相等,返回 1;如果有且仅有一个指针指向空字符,则两个字符串不相等,返回 0。
如果 p 和 q 指向的字符都是普通字符,则比较两个字符是否相等。如果不相等,则两个字符串不相等,返回 0。如果相等,则继续比较下一个字符。
如果 p 指向的字符是删除键,则删除 s 中一个字符,即 p = DeleteChar(p)。
如果 q 指向的字符是删除键,则删除 t 中一个字符,即 q = DeleteChar(q)。
如果删除一个字符之后,p 和 q 指向的字符都是空字符,则两个字符串相等,返回 1;如果有且仅有一个指针指向空字符,则两个字符串不相等,返回 0。
如果删除一个字符之后,p 和 q 指向的字符都是普通字符,则比较两个字符是否相等。如果不相等,则两个字符串不相等,返回 0。如果相等,则继续比较下一个字符。
如果删除一个字符之后,p 指向的字符是普通字符,而 q 指向的是删除键,则 q = DeleteChar(q)。
如果删除一个字符之后,p 指向的是删除键,而 q 指向的是普通字符,则 p = DeleteChar(p)。
重复执行步骤 6-13,直到比较完成。
返回 1,表示两个字符串相等。
下面是经过测试的程式。
#include <stdio.h>
#include <string.h>
char *DeleteChar(char *s) {
int len = strlen(s);
if (len > 0) {
if (s[len - 1] == '#') {
s[len - 1] = '\0';
} else {
s[len - 1] = '\0';
}
}
return s;
}
int CompareString(char *s, char *t) {
char *p = s;
char *q = t;
while (*p != '\0' && *q != '\0') {
if (*p == *q) {
p++;
q++;
} else if (*p == '#') {
p = DeleteChar(p);
} else if (*q == '#') {
q = DeleteChar(q);
} else {
return 0;
}
}
if (*p == '\0' && *q == '\0') {
return 1;
} else {
return 0;
}
}
int main() {
char s[50] = "abddf##";
char t[50] = "addg";
if (CompareString(s, t)) {
printf("s equals t\n");
} else {
printf("s does not equal t\n");
}
return 0;
}