我已经发布了这个问题,但我仍在努力让它正常工作。 Dreamlax 试图通过提供以下步骤来帮助我 -
- 从
n = 1
开始,取字符串的前n个字符。 - 将它与字符串中的最后 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");
}
}
请帮我指出错误。
最佳答案
您的代码中发生了几件事:
你应该用 null 终止你的辅助字符串
A
和B
.或者,yopu 可以比较一下n
第一个字符为strncmp
而不是strcmp
.strcmp
是一个比较函数。如果字符串匹配,它返回零。 (比较函数意味着它可以用于排序以确定一个字符串在词法上是否大于或小于另一个字符串。此类函数的命名法是返回负数表示词法较小,正数表示词法较大,零表示相等。 )你不使用辅助字符串
X
设法找到长度。您可以使用strlen
轻松找到字符串的长度, 像strcmp
, 在<string.h>
中声明后缀的索引计算已关闭。你的长度
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;
}
上面,我说过你可以使用 strncmp
比较字符串中的特定数量的字符。仔细想想,可以省略辅助字符串A
和 B
并只比较原始字符串的一部分:
int is_nice(const char *W)
{
int len = strlen(W);
int n = 1;
while (n < len / 2) {
if (strncmp(W, W + len - n, n) == 0) return 1;
n++;
}
return 0;
}
这节省了大量的复制和一些临时变量,并且还有另一个显着的好处:因为代码不必猜测辅助缓冲区的最大大小,它现在适用于任何大小的字符串。
关于c - 在字符串中查找前缀作为后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21969040/