为什么else语句不能在C的循环中运行?

i7uq4tfw  于 2023-03-01  发布在  其他
关注(0)|答案(2)|浏览(170)

下面是代码,当我运行它时,语句显示循环不能跳转到else函数,我不确定代码的哪一部分是错误的。

bool isPalindrome(char A[], int n) {

    int flag = 1;
    int i;
    
    for (i = 0; i <= strlen(A); i++) {
        if (A[i] != A[strlen(A) - i - 1]) {
            flag = 0;
            break;
        } else {
            flag = 1;
        }
    
    return flag;
}

int main(void) {
    
    char A[] = {};
    bool result;

    printf("Enter a word:");
    scanf("%c", A);
    
    result = isPalindrome(A, strlen(A));

    if (result == true) {
        printf("yes");
    } else {
        printf("no");
    }
    
    return 0;
}

我希望有人能帮我解决这个问题。

vxbzzdmp

vxbzzdmp1#

程序无法编译,因为isPalindrome函数中return flag;语句之前缺少}
此外,在每次成功测试后,无需在循环中将flag设置为1
还要注意的是,由于您提供了字符串长度作为参数,因此不需要多次计算strlen(A)
以下是一个简化版本:

bool isPalindrome(const char A[], int n) {
    for (int i = 0; i < n; i++) {
        if (A[i] != A[n - i - 1])
            return 0;
    }
    return 1;
}

上面的函数对每个字符测试两次。你可以这样进一步简化它:

bool isPalindrome(const char A[], int n) {
    for (int i = 0; i <-- n; i++) {
        if (A[i] != A[n])
            return 0;
    }
    return 1;
}

main函数也不正确:

  • 您应该定义具有指定长度的数组,例如:char A[100].
  • 应该使用%s而不是%c来读取该字,或者使用更好的%99s来防止潜在的缓冲区溢出。

以下是修改后的版本:

int main(void) {
    char A[100];
    bool result;

    printf("Enter a word: ");
    if (scanf("%99s", A) != 1)
        return 1;
    
    result = isPalindrome(A, strlen(A));
    if (result == true) {
        printf("yes\n");
    } else {
        printf("no\n");
    }
    return 0;
}
cwtwac6a

cwtwac6a2#

本声明

char A[]={};

在C中无效。不能使用空的花括号列表作为初始值设定项。
在程序中,应显式指定字符数组的大小,例如

char A[100];

当你试图检查一个字符串是否是回文时,在函数声明中使用第二个参数是没有意义的,甚至当它没有被使用时

bool isPalindrome(char A[], int n){

函数应声明为

bool isPalindrome( const char A[] );

并称之为

bool result = isPalindrome( A );

在函数中,for循环的条件

for(i=0; i<=strlen(A) ;i++){

是错的。
此外,多次调用函数strlen也是低效的。

if(A[i] != A[strlen(A)-i-1]){

该函数可以如下所示

bool isPalindrome( const char s[] )
{
    size_t n = strlen( s );
    size_t i = 0;

    while ( i < n / 2 && s[i] == s[n - i - 1] ) i++;

    return i == n / 2;
}

相关问题