我已经发布了这个问题,但我仍然在努力让它正常工作。 Dreamlax试图通过以下步骤帮助我 -
n = 1
开始,从字符串中取出前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");
}
}
请帮我指出错误。
答案 0 :(得分:1)
您的代码中有几件事情发生了:
您应该终止辅助字符串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;
}
这节省了大量的复制,一些临时变量,还有另一个显着的好处:因为代码不必猜测辅助缓冲区的最大大小,它现在适用于任何大小的字符串。
答案 1 :(得分:1)
您的代码中有三个错误。
第一种是计算输入字符串的长度。在循环之后从len
减去1是不必要的(为小n
模拟此循环以查明原因)。
在这一行:
if (!strcmp(A, B))
您正在比较非空终止字符串,这是未定义的行为。您应该终止字符串A
和B
,或使用strncmp(A, B, n)
来比较最多n
个字符。
第三个错误是逻辑错误。如果字符串“很好”,您的程序将同时输出YES
和NO
。但是这个应该很容易解决。