C 在字符串中查找前缀作为后缀
我已经发布了这个问题,但我仍在努力让它正常工作。Dreamlax试图通过以下步骤来帮助我-C 在字符串中查找前缀作为后缀,c,string,C,String,我已经发布了这个问题,但我仍在努力让它正常工作。Dreamlax试图通过以下步骤来帮助我- 从n=1开始,从字符串中提取前n个字符 将其与字符串中的最后n个字符进行比较 他们匹配吗? 如果是,则打印出前n个字符作为后缀,并停止处理 如果否,则增加n并重试。尝试直到n位于字符串的中间。 以下是我的代码,它不起作用: #include <stdio.h> #include <string.h> void main() { int i, T, flag, j,
- 从
开始,从字符串中提取前n个字符n=1
- 将其与字符串中的最后n个字符进行比较
- 他们匹配吗?
- 如果是,则打印出前n个字符作为后缀,并停止处理李>
- 如果否,则增加n并重试。尝试直到n位于字符串的中间。
#include <stdio.h>
#include <string.h>
void main()
{
int i, T, flag, j, k, len = 0, n;
char W[20], X[20], A[20], B[20];
scanf("%d", &T);
for (i = 0; i < T; i++)
{
scanf("%s", W);
for (len = 0; W[len] != '\0'; len++)
X[len] = W[len];
X[len] = '\0';
len--;
n = 1;
while (n < len / 2)
{
for (k = 0; k < n; k++)
A[k] = W[k];
for (k = 0, j = len - n; W[j] != '\0'; j++, k++)
B[k] = W[j];
if (!strcmp(A, B))
{
printf("YES\n");
break;
}
else
{
n++;
}
}
printf("NO\n");
}
}
#包括
#包括
void main()
{
int i,T,flag,j,k,len=0,n;
字符W[20],X[20],A[20],B[20];
scanf(“%d”、&T);
对于(i=0;i
请帮助我指出错误。您的代码中有几点:
- 您应该以null结尾辅助字符串
和A
。或者,yopu可以将B
第一个字符与n
进行比较,而不是strncmp
strcmp
是一个比较函数。如果字符串匹配,则返回零。(比较函数意味着它可以用于排序,以确定一个字符串在词汇上是大于还是小于另一个字符串。此类函数的术语是:对于词汇上较小的字符串返回负数,对于词汇上较大的字符串返回正数,而零则表示相等。)strcmp
- 您不需要使用辅助字符串
excapt来查找长度。您可以使用X
轻松找到字符串的长度,它与strlen
一样,在strcmp
中声明 - 后缀索引的计算已关闭。您的长度
比实际长度小一个,并且len
是最后一个字符。不要从你的长度中减去一个W[len]
int is_nice(const char *W)
{
char A[20], B[20];
int len = strlen(W);
int j, k, n = 1;
while (n < len / 2) {
for (k = 0; k < n; k++) A[k] = W[k];
A[k] = '\0';
for (k = 0, j = len - n; W[j] != '\0'; j++, k++) B[k] = W[j];
B[k] = '\0';
if (strcmp(A, B) == 0) return 1;
n++;
}
return 0;
}
这节省了大量的复制、一些临时变量,还有一个显著的好处:因为代码不必猜测辅助缓冲区的最大大小,它现在可以用于任何大小的字符串。代码中有三个错误 第一个是在计算输入字符串的长度时。不需要在循环后从
len
中减去1(模拟此循环一小段n
以了解原因)
在这方面:
if (!strcmp(A, B))
您正在比较未定义行为的非空终止字符串。您应该终止字符串A
和B
,或者使用strncmp(A,B,n)
来比较最多n
个字符
第三个错误是逻辑错误。如果字符串为“nice”,程序将同时输出
YES
和NO
。但是这个应该很容易修复。它被称为回文。您应该使用null终止辅助字符串a
和B
。另外,中断
将在循环时中断,打印可能的是和否。否,不是回文。这里是确切的问题-如果一个单词包含与正确的前缀和后缀相同的字符串,那么这个单词就是好的。正确的前缀或后缀不能与单词本身一样长。e、 麦纳麦很好,因为它包含了一个适当的前缀和后缀。巴拿马不是一个好词。找出一个词是好是坏。输入输入的第一行包含T,测试用例的数量。T测试用例如下。每个测试用例都包含一个单词W。对于start,X[20]
和flag
都未使用,main()
的返回类型应该是int
而不是void
。
if (!strcmp(A, B))