字符串palindrom检查

时间:2016-12-17 08:44:01

标签: c string palindrome

我正在尝试编写一个函数来检查给定字符串中有多少个单词并将该数字返回给main。 我的方法是检查字符串的长度并反向复制到另一个字符串然后比较两者。 每次检查时都会检查空白区域

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int palindrom(char str1[81]);

int main(){

    char str[81];
    gets(str);
    printf("%d pali\n", palindrom(str));


}


int palindrom(char str[81]) {

    int i, j=0, k = 0, pali_count = 0, length = 0, flag=0;
    char rev[81], c;
    for (i = 0; str[i] != '\0'; i++){}//getting the string length

    while (i >= 0) {//revrsing the string 
        rev[j++] = str[--i];
    }
    rev[j-1] = '\0';
    printf("%s", rev);


    length = j - 2;
    k = length;
    j = 0;
    while (k >= 0) {
        k--;
        j++;
        c = rev[k];
        if (rev[k] != str[j])
            flag++;
        if (c == ' ') {
            if (flag == 0)
                pali_count++;
            flag = 0;
            continue;
        }

        return pali_count;

    }





    return 0;

}

3 个答案:

答案 0 :(得分:1)

您的代码中存在大量错误。让我一个一个地解释你:

  • while loop(您使用当前字符串检查反向字符串)中,在一次迭代后返回pali_count,该迭代始终为零。
  • 如果你的最后一个字是一个回文词,它永远不会给你回文,因为你的遗言中没有空格。
  • 最后你的整个算法都错了。请查看以下示例:

      

    假设,str =&#39; sabuj&#39;

         

    反转后,它将是:rev =&#39; jubas&#39;

         

    现在,如果你用第一个字符检查最后一个字符,那么所有字符都是相同的,因此它会给你错误的结果。你需要用第一个字符检查第一个字符,而不是第一个用最后一个字符,因为你已经反转了字符串。

         

    如果像mahedi sabuj这样的句子被检入jubas ideham,你也会遇到另一个问题,这也是错误的,因为这里我们将第一个单词与第二个单词匹配,反之亦然。

现在这是解决方案:

  • space
  • 拆分句子
  • 每个单词都是回文
  • 如果是,则增加计数

以下是代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int palindrom(char str1[81]);

int main(){

    char str[81];
    gets(str);

    int result = 0;

    char *p = strtok(str, " "); // split word by space

    while(p != NULL)
    {
        result += palindrom(p);
        p = strtok(NULL, " ");
    }


    printf("%d pali\n", result);
}


int palindrom(char str[81])
{

    int i, j=0, k = 0, pali_count = 0, length = 0, flag=0;
    char rev[81], c;

    for (i = 0; str[i] != '\0'; i++){} //getting the string length

    while (i >= 0)  //revrsing the string
    {
        rev[j++] = str[--i];
    }

    rev[j-1] = '\0';

    length = j - 2;
    k = length;
    j = length;

    while (k >= 0)
    {
       if (str[j] != rev[k])
         return 0;

       k--;
       j--;
    }

    return 1;
}

示例I / O:

女士mm sabuj - &gt; 2 pali

sabuj - &gt; 0 pali

答案 1 :(得分:0)

请勿使用gets,而是使用fgets

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STRSIZE 81

int is_palindrome(char *word);

int
main(void) {
    char str[STRSIZE];
    size_t slen;
    char *word;
    const char *delim = " ";
    int ispal = 0;

    printf("Enter some text: ");
    if (fgets(str, STRSIZE, stdin) == NULL) {
        printf("Cannot read text into buffer.\n");
        exit(EXIT_FAILURE);
    }

    slen = strlen(str);
    if (slen > 0) {
        if (str[slen-1] == '\n') {
            str[slen-1] = '\0';
        } else {
            printf("Too many characters entered.\n");
            exit(EXIT_FAILURE);
        }
    }

    if (!*str) {
        printf("No text entered.\n");
        exit(EXIT_FAILURE);
    }

    word = strtok(str, delim);
    while (word != NULL) {
        if (is_palindrome(word)) {
            ispal++;
        }
        word = strtok(NULL, delim);
    }

    printf("%d palindromic words found.\n", ispal);
    return 0;
}

int
is_palindrome(char *word) {
    int start, end;

    if (!word) {
        return 0;
    }

    if (strlen(word) == 1) {
        return 1;
    }

    start = 0;
    end = strlen(word) - 1;
    while (start < end) {
        if (word[start++] != word[end--]) {
            return 0;
        }
    }

    return 1;
}

答案 2 :(得分:0)

import java.util.Scanner;

public class Javatips {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String x = in.next();
        int n = x.length();
        boolean isPalindrom = true;
        for (int i = 0; i < n / 2 - 1; i++) {
            if (x.charAt(i) == x.charAt(n - 1 - i)) {
                isPalindrom = true;
            } else {
                isPalindrom = false;
            }
            if (isPalindrom) {
                System.out.println("the String " + x + " is palindrom");
            } else {
                System.out.println("the String " + x + " is not palindrom");
            }
        }
    }
}