【问题标题】:FACING PROBLEM WHILE COMPARING "Hello" with "olleH"比较“Hello”和“olleH”时遇到的问题
【发布时间】:2021-02-12 11:42:33
【问题描述】:

我正在尝试用 c 编写一个程序,它可以识别一个字符串是否等于它的反转。

#include <stdio.h>
#include <string.h>
#include <conio.h>
int main(){
    char str1[10] = "Hello";
    if (str1 == strrev(str1)){
        printf("True");
    }
    else{
        printf("False");
    }
getch();
return 0;
}

据我所知,它应该打印 False 但它正在打印 True 。任何人都可以解决这个问题。 谢谢

【问题讨论】:

  • 用您自己的话说,当您使用== 比较两个char* 值时,您期望会发生什么?另外,您是否尝试阅读strrev 的文档?
  • 读取How do I properly compare strings in C?,然后编写一个程序检查两个字符串是否相同。一旦你开始工作,就可以进入相反的场景。

标签: c if-statement comparison reverse c-strings


【解决方案1】:

似乎函数strrev 没有创建新的字符数组。它将字符串反转到位。所以在这个 if 语句中

if (str1 == strrev(str1)){

比较两个指向同一个字符数组str1的第一个元素的指针。

要比较两个字符串,请使用标准 C 函数 strcmp。例如

char str1[10] = "Hello";
char str2[10];

strcpy( str2, str1 );

if ( strcmp( str1, strrev(str2) ) == 0 ){
    printf("True");
}
else{
    printf("False");
}

【讨论】:

    【解决方案2】:

    如果您使用运算符==,您只是将str1 内存地址指针与其自身进行比较,结果当然是正确的,尽管strrev 修改了数组。 正如前面的答案所说,您应该创建字符数组str1 的副本,而不是使用strcmp 来比较两个数组。

    【讨论】:

      【解决方案3】:

      我认为值得指出的是,无需创建原始字符串的副本即可检查回文。这将导致代码运行速度更快并使用更少的内存。

      #include <stdio.h>
      #include <string.h>
      
      int is_palindrome(const char *s) {
          int n = strlen(s);
          for (int i=0; i < n--; i++) {
              if (s[i] != s[n]) return 0;
          }
          return 1;
      }
      
      int main() {
          char *s1 = "racehorse";
          char *s2 = "racecar";
          printf("'%s' %s a palindrome\n", s1, is_palindrome(s1) ? "is" : "is not");
          printf("'%s' %s a palindrome\n", s2, is_palindrome(s2) ? "is" : "is not");
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        • 2020-03-28
        • 1970-01-01
        • 2012-09-01
        相关资源
        最近更新 更多