我的代碼永遠不會停止要求輸入,所以我想我一定是做了一個無限回圈,但我找不到錯誤在哪里。我還注意到,當逐行插入輸入時,它在插入第二個回圈的第一行后列印一個回圈的結果,這對我來說似乎不正確。請幫我除錯。(對于進一步的背景關系,代碼應該接收一個我們稱之為 n 的數字,然后再掃描 3n 行,基本上是 n 束 3 行相似的行。第 2 行和第 3 行是兩個字符數相同的單詞, 第一行是那個數字。輸出是這些詞是否是字謎。)
#include <stdio.h>
int main() {
int n, l;
scanf("%d\n", &n);
for (int i = 1; i <= n; i ) {
scanf("%d\n", &l);
char A[l], B[l];
for (int j = 0; j < l; j ) {
scanf("%c", &A[j]);
scanf("\n");
}
for (int j = 0; j < l; j ) {
scanf("%c", &B[j]);
scanf("\n");
}
for (int k = 0; k < l; k ) {
int result = 0;
for (int j = 0; j < l; j ) {
if (A[k] == B[j]) {
result = 1;
}
}
if (!result) {
printf("\nNO\n");
return 0;
}
}
printf("\nYES\n");
}
}
例子:
輸入:
2
6
listen
silent
4
Evil
live
輸出:
YES
NO
uj5u.com熱心網友回復:
那是因為你一遍又一遍地要求輸入,
不確定您要實作的目標,但首先洗掉額外的scanfs
嘗試這個,
#include <stdio.h>
int main() {
int n, l;
scanf("%d\n", &n);
for (int i = 1; i <= n; i ) {
char A[l], B[l];
for (int k = 0; k < l; k ) {
int result = 0;
for (int j = 0; j < l; j ) {
if (A[k] == B[j]) {
result = 1;
}
}
if (!result) {
printf("\nNO\n");
return 0;
}
}
printf("\nYES\n");
}
}
uj5u.com熱心網友回復:
您的scanf呼叫等待額外的\n,這需要更多的輸入才能進入。
要解決此問題,請\n從您的scanf通話中洗掉。輸入A和時也洗掉額外的呼叫 B:
我添加了一些除錯代碼來演示您在輸入輸入時在程式執行中的位置。
#include <stdio.h>
int main() {
int n, l;
int res;
res=scanf("%d", &n);
printf ("res=%d, n=%d\n", res, n);
for (int i = 1; i <= n; i ) {
res = scanf("%d", &l);
printf ("res=%d, l=%d\n", res, l);
// char A[l], B[l];
char A[l 1], B[l 1];
for (int j = 0; j < l; j ) {
scanf(" %c", &A[j]);
}
printf ("A done\n");
for (int j = 0; j < l; j ) {
scanf(" %c", &B[j]);
}
printf ("B done\n");
A[l] = 0; B[l] = 0;
printf ("A=\"%s\" - B=\"%s\"\n", A, B);
...
現在您的輸入應該可以正常作業。
但是您的代碼還包含另一個錯誤。您將把"12344"和"11234"視為正確匹配 wchich 是錯誤的。
要解決此問題,您需要從 中洗掉每個匹配的字符B:
for (int k = 0; k < l; k ) {
int result = 0;
// We compare A[k] with the remaining characters in B only
for (int j = k; j < l; j ) {
if (A[k] == B[j]) {
result = 1;
B[j] = B[k]; // Replace matching character with non-matching character we checked earlier.
break;
}
}
if (!result) {
printf("\nNO\n");
return 0;
}
}
printf("\nYES\n");
一旦找到第一個匹配項并從 中洗掉該字符,此代碼就會停止B。中的條目B重新排列,以保持未使用的條目在最后。
完整代碼如下所示:
#include <stdio.h>
int main() {
int n, l;
int res;
res=scanf("%d", &n);
printf ("res=%d, n=%d\n", res, n);
for (int i = 1; i <= n; i ) {
res = scanf("%d", &l);
printf ("res=%d, l=%d\n", res, l);
// char A[l], B[l];
char A[l 1], B[l 1];
for (int j = 0; j < l; j ) {
scanf(" %c", &A[j]);
}
printf ("A done\n");
for (int j = 0; j < l; j ) {
scanf(" %c", &B[j]);
}
printf ("B done\n");
A[l] = 0; B[l] = 0;
printf ("A=\"%s\" - B=\"%s\"\n", A, B);
for (int k = 0; k < l; k ) {
int result = 0;
for (int j = k; j < l; j ) {
if (A[k] == B[j]) {
result = 1;
B[j] = B[k];
break;
}
}
if (!result) {
printf("\nNO\n");
return 0;
}
}
printf("\nYES\n");
}
}
輸出:
~/stackoverflow$ ./test
4
res=1, n=4
2
res=1, l=2
12
A done
21
B done
A="12" - B="21"
YES
6
res=1, l=6
liver1
A done
evil1r
B done
A="liver1" - B="evil1r"
YES
3
res=1, l=3
111
A done
111
B done
A="111" - B="111"
YES
4
res=1, l=4
abcd
A done
dcbb
B done
A="abcd" - B="dcbb"
NO
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372491.html
