判断字符串相等

 1 #include <iostream>
 2 #include <cstring>//support for strcmp(),也可写成#include "string.h"
 3 using namespace std;
 4
 5 int main()
 6 {
 7     const char *str1 = "abc";
 8     const char *str2 = "abc";
 9     char str3[4] = "abc";//{‘a‘,‘b‘,‘c‘};
10     char str4[4] = "abc";//{‘a‘,‘b‘,‘c‘};
11     string str5 = "abc";
12     string str6 = "abc";
13     cout<<&str3<<" " <<&str4<<endl;
14     cout<<&"abc"<<" " <<&"abc"<<" "<<&"abc"<<endl;
15     cout<<"str1 == str2: "<<(str1 == str2)<<endl;
16     cout<<"*str1 == *str2: "<<(*str1 == *str2)<<endl;
17     cout<<"str3 == str4: "<<(str3 == str4)<<endl;
18     cout<<"str3 > str4: "<<(str3 > str4)<<endl;
19     cout<<"strcmp(str3,str4): "<<strcmp(str3,str4)<<endl;//char数组标准的判断相等函数
20     cout<<"str5 == str6: "<<(str5 == str6)<<endl;
21     /**
22     输出:
23     0x28fe92 0x28fe8e
24     0x47f000 0x47f000 0x47f000
25     str1 == str2: 1
26     *str1 == *str2: 1
27     str3 == str4: 0
28     str3 > str4: 1
29     strcmp(str3,str4): 0
30     str5 == str6: 1
31     */
32
33     return 0;
34 }
35 /**
36 strcmp()函数解析:
37
38 头文件:#include <string.h>
39
40 strcmp() 用来比较字符串(区分大小写),其原型为:
41     int strcmp(const char *s1, const char *s2);
42
43 【参数】s1, s2 为需要比较的两个字符串。
44
45 字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。
46 strcmp()首先将s1 第一个字符值减去s2 第一个字符值,
47 若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。
48 例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和‘b‘(98)的差值(-33)。
49
50 【返回值】若参数s1 和s2 字符串相同则返回0。s1 若大于s2 则返回大于0 的值。s1 若小于s2 则返回小于0 的值。
51
52 */ 

(1)str1和str2是char*,也就是一个指针,然后它们都来自于"abc"的赋值,通过直接输出"abc"的地址可以发现都是相等的,因为它是一个const string,存放在全局数据区当中,对str1和str2的初始化,C++只会建立一个"abc" const string,从而str1和str2这两个指针指向的是同一块内存,也就是说str1和str2的值(是那块同样的内存的地址值)是相等的,于是str1 == str2就解释得通了。

(2)*str1 ==  *str2因为取的是同一块内存里面的东西,自然也是相等。

(3)再看char[]数组,无论是

  char str3[] = "abc";

还是

  char str3[] = {‘a‘,‘b‘,‘c‘};

其过程都是将元素逐一复制到str3数组当中,它并不存在指针指向一个const string一说,并且str3表示的是数组的首地址,同理str4.直接拿str3 == str4来作比较,也即拿这两个char数组的首地址的值来比较,自然是不相等的,str3数组的首地址比str4的首地址要大,也就是str3 > str4返回的是1(true),所以注意这里是拿它们的地址来作比较。

所以str1 == str2  与 str3 == str4:一个是常量字符串(位于内存四区中的数据区中的常量区)的指针(地址)比较,一个是数组(栈内存)地址比较。

关于C/C++语言的内存四区模型理解:参考下面的博客:

C语言之内存四区模型和函数调用模型

(4)来到strcmp函数,这个函数是用来比较两个char *字符串的大小,如果两个字符串相等则返回0,前面的比后面的大则返回1,反之则返回-1,所以用这个函数才能判断出str3和str4代表的字符串是相等的,前面的只是拿地址来比较,而不是内容的比较。因为在C语言中,char数组(C风格字符串)并不支持直接使用==来判断字符串相等,需要调用函数才能达到目的。

(5)至于string,跟(1)差不多的原理,而且C++的string本来就支持直接使用“==”来比较两个字符串是否相等(运算符重载的支持)。

参考文档:http://blog.csdn.net/lv_victor/article/details/52578320

时间: 2024-10-12 03:02:10

判断字符串相等的相关文章

判断字符串是不是数字

NumberUtils.isNumber(str)判断字符串是不是数字或者能不能转换成数字 public class StringIsNumber { public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.nextLine(); if(NumberUtils.isNumber(str)){ System.out.println("输入的是数字"); }els

练习:判断字符串“mingrikejijavabu”中,字符“i”出现了几次,并将结果输出。

1 // 判断字符串“mingrikejijavabu”中,字符“i”出现了几次,并将结果输出. 2 3 String str="mingrikejijavabu"; 4 5 //方法1:替换法 6 String str1=str.replace("i",""); //将字符串中i替换为空,创建新的字符串 7 System.out.println("i出现的次数为:"+(str.length()-str1.length()))

判断字符串中字母出现的次数用分割法

public class zuoye3 { public static void main(String[] args) { String a="mingrikejijavabu";//判断字符串“i”出现了几次并将其输出 int c=0;//令c为i出现的次数 String[] b=a.split("");//分隔符,把语句分割. for (String x:b)//遍历输出一遍所有字母 { if(x.equals("i"))//是否有与i相等

PHP判断字符串中是否包含指定字符串,支持中文哦

RT,随手写的 1 /** 2 * 判断字符串中是否包含指定字符串 3 * @var source 源字符串 4 * @var target 要判断的是否包含的字符串 5 * @return bool 6 */ 7 function hasstring($source,$target){ 8 preg_match_all("/$target/sim", $source, $strResult, PREG_PATTERN_ORDER); 9 return !empty($strResul

Valid Palindrome ——判断字符串是否为回文串

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41488377 Valid Palindrome Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. For example, "A man, a plan, a canal: Panama&

用递归法判断字符串A中包含多少个字符串B

string类提供了判断字符串B在字符串A中首次(或最后)出现的Index的方法,但有时候需要判断B在A中出现了多少次. 为此想了一个算法. 1 public static void CountIndexOf1(string A, string B,int startindex,ref int count) 2 { 3 4 int j= A.IndexOf(B,startindex); 5 if (j <= 0) 6 return; 7 count++; 8 CountIndexOf(A, B,

Java 判断是否为汉字 判断是否为乱码 判断字符串是否为双整型数字 整数 数字

/**  * 判断是否为汉字  *   * @param str  * @return  */ public static boolean isGBK(String str) {  char[] chars = str.toCharArray();  boolean isGBK = false;  for (int i = 0; i < chars.length; i++) {   byte[] bytes = ("" + chars[i]).getBytes();   if (

AC日记——判断字符串是否为回文 openjudge 1.7 33

33:判断字符串是否为回文 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个字符串,输出该字符串是否回文.回文是指顺读和倒读都一样的字符串. 输入 输入为一行字符串(字符串中没有空白字符,字符串长度不超过100). 输出 如果字符串是回文,输出yes:否则,输出no. 样例输入 abcdedcba 样例输出 yes 思路: 模拟: 来,上代码: #include<cstdio> #include<string> #include<cstring>

判断字符串中是否是数字

Java中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); i++){ System.out.println(str.charAt(i)); if (!Character.isDigit(str.charAt(i))){ return false; } } return true; } 2.用正则表达式 首先要import java.

判断字符串的开头和结尾

package com.text_1; public class lianxi1111 { public static void main(String[] args) { // TODO 自动生成的方法存根 //代码实现判断字符串的开头和结尾 String str="jnjcubhksbwiowhfkalohafwac"; if (str.indexOf("jnj")==0) { System.out.println("jnj"+"是