C 在字符串中查找前缀作为后缀

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,

我已经发布了这个问题,但我仍在努力让它正常工作。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");
    }
}
#包括
#包括
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
    B
    。或者,yopu可以将
    n
    第一个字符与
    strncmp
    进行比较,而不是
    strcmp

  • strcmp
    是一个比较函数。如果字符串匹配,则返回零。(比较函数意味着它可以用于排序,以确定一个字符串在词汇上是大于还是小于另一个字符串。此类函数的术语是:对于词汇上较小的字符串返回负数,对于词汇上较大的字符串返回正数,而零则表示相等。)

  • 您不需要使用辅助字符串
    X
    excapt来查找长度。您可以使用
    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))