字符型变量和字符串长度变量 定 义 的区别。

字符串指针变量与字符数组的区别
使用字符串指针变量与字符数组的区别
(1)分配内存
  设有定义字符型指针变量与字符数组的语句如下:
  char *pc ,str[100];
  则系统将为字符数组str分配100个字节的内存单元,用于存放100个字符。而系统只为指针变量pc分配4个存储单元,用于存放一个内存单元的地址。
(2)初始化赋值含义
  字符数组与字符指针变量的初始化赋值形式相同,但其含义不同。例如:
  char str[ ] ="I am a student ! " ,s[200];
  char *pc="You are a student ! " ;
  对于字符数组,是将字符串放到为数组分配的存储空间去,而对于字符型指针变量,是先将字符串存放到内存,然后将存放字符串的内存起始地址送到指针变量pc中。
(3)赋值方式
  字符数组只能对其元素逐个赋值,而不能将字符串赋给字符数组名。对于字符指针变量,字符串地址可直接赋给字符指针变量。例如:
  str="I love China! "; //字符数组名str不能直接赋值,该语句是错误的。
  pc="I love China! "; //指针变量pc可以直接赋字符串地址,语句正确
(4)输入方式
  可以将字符串直接输入字符数组,而不能将字符串直接输入指针变量。但可将指针变量所指字符串直接输出。
  例如: cin && str //正确
 cin && pc //错误
 cout&&pc //正确
(5)值的改变
  在程序执行期间,字符数组名表示的起始地址是不能改变的,而指针变量的值是可以改变的。&&&&&&例如:&&&
str=str+5; //错误
  &&& pc=str+5;
小结 字符数组s[100] 指针变量pc
  (1)分配内存 分配100个单元 分配4个单元。
  (2)赋值含义 字符串放到数组存储空间 先将字符串存放到内存
  将存放串的首地址送到pc中。
  (3)赋值方式 只能逐个元素赋值 串地址可赋给pc
  (4)输入方式: 串直接输入字符数组 不能将字符串直接输入指针变量
  (5)值的改变: 字符数组首地址不能改变 指针变量的值可以改变
由以上区别可以看出,在某些情况下,用指针变量处理字符串,要比用数组处理字符串方便。&
用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:
字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
对字符串指针方式
char *ps="C Language";
可以写为:
ps="C Language";
而对数组方式:
static char st[]={"C Language"};
不能写为:
char st[20];
st={"C Language"};
而只能对字符数组的各元素逐个赋值。
从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。
当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
一个错误的例子,如下:&&&&&&&
&&&&&&&&&&
&&&&&&&&&&
scanf("%s",name);
&&&&&&&&&&
printf("%s",name);
&有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
&&&&&&&&&&
数组的方法:&&&&&&&&&&&&&&&&
char name[20];
&&&&&&&&&&&&&&&&
scanf("%s",name);
&&&&&&&&&&&&&&&&
printf("%s",name);&&&&&
给字符针针分配内存空间的办法:
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
name=(char*)malloc(50);&&&&&
//此时name已经指向一个刚刚分配的地址空间。
&&&&&&&&&&&&&&&&
scanf("%s",name);
&&&&&&&&&&&&&&&&
printf("%s",name);
但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。
&char str1[40]="hello
world!";&&&&
//char *str1="hello world!";
&str1[4]='A';&&&&&&&&&&&&&&&&&&&&&
//若str1是指针型的,编译通过,但运行是此处会段错误
&printf("%sn",str1);
&return 0;
关于“&str1[4]='A';&//若str1是指针型的,编译通过,但运行是此处会段错误”这句的分析讲的非常好,如下:
str1是指针型时,“hello&world!”是一个字符串常量,放在内存里,str1指向其内存地址。
什么是字符串常量呢?就是我们不能更改起内容的字符串。所以str1[4]='A';这样赋值就会出错。
至于为什么是运行出错而不是编译出错,我想这是编译器的问题。我用的是gcc编译器,他可能并不知道str1指向的是一个字符串常量,我们当然可以设计自己的编译器让它识别这样的错误使程序在编译时就报错。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。C语言:已定义C为字符型变量,则虾类语句中正确的是()A) c='97';B) c="97";C) c=97;D) c="a";
清枫鯧偷缛
选cA) c='97';错误定义B) c="97";字符串表示C) c=97;97为字母aD) c="a";字符串表示
为您推荐:
其他类似问题
扫描下载二维码共有 29215 人关注过本帖
标题:怎么定义字符串变量!
等 级:新手上路
帖 子:13
&&问题点数:0&&回复次数:8&&&
怎么定义字符串变量!
char ct是字符变量,而不是字符串变量!
请问用什么定义字符串变量
还有就是字符串不能用”==“比较的
那要用什么做比较??
谁帮我改改这个,我万分感激!!!
搜索更多相关主题的帖子:
等 级:新手上路
帖 子:1146
char a[100]用字符数组定义字符串用“string.h"文件头中的strcmp(串1,串2)比较,相等时返回值为1
等 级:论坛游侠
帖 子:223
专家分:160
1, 使用字符数组,如:
StringArray[] = "I am a boy";
2, 使用字符指针
可以直接制向一个字符串
pString = "I am a boy";
也可以申请自己的空间,然后把字符串通过strcpy函数拷贝进来,如:
pString = (char *)malloc( (strlen("I am a boy") + 1) * sizeof(char) );
strcpy(pString, "I am a boy");比较的话如2楼所说,使用strcmp函数.
如果你爱C语言,请你爱指针;
如果你爱指针,请你爱指针的指针;
等 级:贵宾
威 望:40
帖 子:10387
专家分:298
以下是引用空前在 18:19:03的发言:
char a[100]
用字符数组定义字符串
用“string.h"文件头中的
strcmp(串1,串2)比较,
相等时返回值为1
#include &string.h&
#include &stdio.h&
int main(void)
char *buf1 = "aaa", *buf2 = "aaa";
printf("%d",strcmp(buf2, buf1));
你看看是多少?
strcmp函数的原码大至如下:
int strcmp(char *string1,char *string2)
while(*string1)if(*string1++!=*string2++)return *string1-*string2;
所以,两串相同返回的是0,两串不同返回第一个不同之处的差值。
九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。&&&&&-老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。&&&-毛泽东
等 级:新手上路
帖 子:312
楼上几位都说的不错!
永不放弃!
等 级:新手上路
帖 子:13
感谢感谢!!!!!爱死你们了!
等 级:新手上路
帖 子:1146
以下是引用knocker在 21:02:36的发言:
#include &string.h&
#include &stdio.h&
int main(void)
char *buf1 = "aaa", *buf2 = "aaa";
printf("%d",strcmp(buf2, buf1));
你看看是多少?
strcmp函数的原码大至如下:
int strcmp(char *string1,char *string2)
while(*string1)if(*string1++!=*string2++)return *string1-*string2;
所以,两串相同返回的是0,两串不同返回第一个不同之处的差值。
不好意思,记错了,谢谢大哥的提醒!
等 级:新手上路
帖 子:175
到底为多少我们可以自己定义,不过应当符合可移植性标准.
等 级:贵宾
威 望:67
帖 子:12443
新版C++里面提供类型为string的变量,只要包含头文件string.h,且是对象调用,内有函数可用。
版权所有,并保留所有权利。
Powered by , Processed in 0.033883 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved搜索-Lucene-Solr-Sphinx(13)
在数据挖掘的研究中,我们往往需要判断文章是否雷同对类似文章或短句进行归类处理等,这其中就会遇到这样的问题:如何确定两个字符串之间的相似程度。
本文综合作者的实际工作经验和数据挖掘理论,结合中文字符串特性介绍一套相对完整的方法,以解决上述问题。
&&&&&最简单的问题求解
字符串由一组不同含义的单词组成,它不同于数值型变量,可以用一个特定的数值来确定它的大小或位置,所以用何种方式来描述两个字符串之间的距离,成为了一个值得探讨的问题。
通常情况下,用于分析的数据类型有如下几种:区间标度遍历、二元变量、标称型变量、序数型变量、比例标度型变量、混合类型变量等。
综合这些变量类型,本文认为字符串变量更适合于归类于二元变量,我们可以利用分词技术将字符串分成若干个单词,每个独立的单词作为二元变量的一个属性。我们把所有单词设定为一个二元变量属性集合,字符串和字符串的单词包含于这个集合。设是字符串和字符串中都存在的单词的总数,是字符串中存在,字符串中不存在的单词总数,是字符串中存在,字符串中不存在的单词总数,是字符串和字符串中都不存在的单词总数。我们称为字符串比较中的个状态分量。如图所示:
由于两个字符串都不存在的单词对两个字符串的比较没有任何作用,所以忽略,于是我们采用非恒定的相似度评价系数系数来描述两个字符串见的相异度表示公式为
相异度,不难推断,他们的形似度公式为
相似度公式
图字符串关系描述
例如如下两个字符串串:
字符串:非对称变量
字符串:非对称空间
他们的二元属性关系表为:
字符串属性
非对称变量
非对称空间
表示存在该单词属性,表示不存在该单词属性
那么对应的
两个字符串的相似度为
单词重复问题求解
前面讨论的问题是最简单的字符串比较问题,这个问题中单个字符串不存在重复的单词,然而如果字符串中出现重复单词,采用上一节的公式套用后得到的结果往往不够理想,比如
字符串:前进前进
字符串:前进
公式相似度来计算,
,得到的相似度为,而实际上这两个字符串并不完全相同。为解决这个问题,我们必须将在不同位置出现的相同单词假设为不同单词,以其在字符串中出现的次序作为区分,这样其二元属性关系表如下:
字符串属性
其相似度为
状态分量权重&
在实际应用中,三种状态分量并不一定是同等价值的,它们往往根据实际应用的需要存在不同的权重,比如对于某些应用来说,两个字符串中相同单词数量比不同单词数量更能说明字符串的相似程度,那么我们必须将的权重提高,重新计算相似程度。
我们设对应三个变量的权重分别是,则公式演进为
相似度公式
回到上面问题,对于上一节的两个字符串,如果我们设置,则更加公式
它们的相似度为
同义词问题
在语言中,同义词是经常遇到的问题,如果两个字符串中存在同义词,其相似度又如何计算呢。
对于同义词问题,我们要从分词过程中来解决。首先我们需要构建一个同义词对照表,将同义词对应到一个等价单词,在对字符串分词后对字符串中的所有单词到同义词表中查找,如果存在,则替换为对应的等价单词,这样分词后,两个字符串中的同义词就指向了相同的单词。
比如存在同义词表如下:
字符串:他也许不来了
字符串:他可能不来了
分词后二元属性关系表如下:
字符串属性
他也许不来了
他可能不来了
不难看出,两个字符串的相似度为
同音不同义
在中文网络环境中,由于大多数网络文章的作者都是采用拼音输入法输入汉字,经常会出现输入同音不同义的文字错误,为了纠正这种错误,我们可以考虑采用汉语拼音的方式进行分词,也可以综合分词,也就是先正常分词,在拼音分词,字符串的分词结果去两者的并集。
一 向量空间模型 与TF-IDF
Vector space model&(or&term vector model) is an algebraic model for representing text documents (and any objects, in general) as vectors of identifiers, such as, for example,
index terms. It is used in information filtering, information retrieval, indexing and relevancy rankings. Its first use was in the SMART Information Retrieval System.
向量空间模型(项向量模型)是一个用来表示文本文档(通常也包含一些对象)的特征向量的数学模型,例如索引词项.它被广泛应用于信息过滤,信息检索,索引和相关度计算.最早使用向量空间模型的是SMART信息检索系统.
Clotho注: 词项(term)一般情况下就是一个词(word),特别是在文本索引领域.
Definitions
A document is represented as a vector. Each dimension corresponds to a separate term. If a term occurs in the document, its value in the vector is non-zero. Several different ways of computing these values, also known as (term) weights, have been developed.
One of the best known schemes is tf-idf weighting (see the example below).
The definition of&term&depends on the application. Typically terms are single words, keywords, or longer phrases. If the words are chosen to be the terms, the dimensionality of the vector is the number of words in
the vocabulary (the number of distinct words occurring in the corpus).
一个文档可以表示成一个向量.一个维度相当于一个词项(term).如果一个词项出现在一篇文档中,它在向量中的值是非零的.有几种不同的计算这些被看作(词项)权重的向量值的方法被逐渐提出来.其中一种最著名的方法是tf-idf加权(看下面的例子).
词项的定义是依赖于应用的.一般而言,词项就是单字(单词),关键字,或者长短语.如果词(word)被选作词项(term),向量的维度就等于词汇表中的词数(出现在文档全集中所有不同的词的数量).
Applications
Relevancy rankings of documents in a keyword search can be calculated, using the assumptions of document similarities theory, by comparing the deviation of angles between each document vector and the original query vector where the query is represented as same
kind of vector as the documents.
In practice, it is easier to calculate the cosine of the angle between the vectors instead of the angle:
A cosine value of zero means that the query and document vector are orthogonal and have no match (i.e. the query term does not exist in the document being considered). See cosine similarity for further information.
基于关键字检索的文档相关度计算,可以用文档相似度理论的假设来实现,就是比较每个文档向量和原始查询向量的夹角,其中查询是表示为与文档一样的向量.
(Clotho注:其实就是两个文档向量之间比较)
在实践中,计算两个向量夹角的余弦值(cosine)会比直接计算角度更简单:
余弦值为0时表示查询向量和文档向量之间呈直角,也就是查询和文档完全不相似(也就是查询的词项在被查询的文档中不存在).查看以获得更多信息.
In the classic vector space model proposed by Salton, Wong and Yang&[1]&the
term specific weights in the document vectors are products of local and global parameters. The model is known as term frequency-inverse document frequency model. The weight vector for document&d&is&,
term frequency of term&t&in document&d&(a local parameter)&is inverse
document frequency (a global parameter).&|&D&|&is the total number of documents&&is
the number of documents containing the term&t.
In a simpler Term Count Model the term specific weights do not include the global parameter. Instead the weights are just the counts of term occurrences:&wt,d&=
例子: tf-idf权重
在Salton、王、杨提出的经典向量空间模型中,文档向量中词项的权重是局部参数和全局参数的乘积.该模型被认为是词频-倒文档频率模型.文档的权重向量d是,
在上面公式中,
* tft&是词项t在文档d中的频率(一个局部参数)
拟文档频率的算法
*&是倒文档频率(一个全局参数).&|&D&|&是文档集合中的文档总数;&是包含词项t的文档数.
在一个更简单的词项计算模型中,词项的权重不包括全局变量(倒文档频率),而只使用词频作为权重wt,d&=
Limitations
The vector space model has the following limitations:
Long documents are poorly represented because they have poor similarity values (a small scalar product and a large dimensionality)Search keywords must precisely
word substrings might result in a &false positive match&S documents with similar context but different term vocabulary won't be associated, resulting in a &false negative match&.The order in which the terms appear in the document is lost in the vector space representation.
向量空间模型具有以下局限:
长篇的文档会被表示得不符合实际,因为它们只有较低的相似度值(一个小的乘积和一个大的维度数).检索的关键字必须精确匹配文档中的词项;词素的检索可能会得到&错误肯定匹配&.(Clotho注:不相似被当成相似)语义敏感;那些拥有相似语义但使用的词汇不同的文档,会被当成&错误否定匹配&.(Clotho注:相似被当成不相似)词项在文档中的顺序会在向量空间的表示中忽略.
二 & 余弦相似度
Cosine&similarity&[1][2]&is
a measure of similarity between two vectors of&n&dimensions by finding the cosine of the angle between them, often used to compare documents in text mining. Given two vectors of attributes,&A&and&B,
the cosine similarity,&θ, is represented using a dot product and magnitude as
余弦相似度是利用两个n维向量的夹角余弦值来计算它们相似度的方法,经常用于在文本挖掘中比较文档.给定两个向量的属性(维度)A和B,它们的夹角θ,余弦相似度以点积和向量长度表示为
For text matching, the attribute vectors&A&and&B&are usually the term frequency vectors of the documents. The cosine similarity can be seen as a method of normalizing
document length during comparison.
在文本匹配中,属性(维度)向量通常是文档的词频向量.余弦相似度可以看作一个在比较中规范化文档长度的方法.
The resulting similarity ranges from -1 meaning exactly opposite, to 1 meaning exactly the same, with 0 indicating independence, and in-between values indicating intermediate similarity or dissimilarity.
相似度的结果的范围从-1(表示完全相反)到1(表示完全相同),0表示互相独立,其余的值表示文档的相似度和相反度.
In the case of information retrieval, the cosine similarity of two documents will range from 0 to 1, since the term frequencies (tf-idf weights) cannot be negative. The angle between two term frequency vectors cannot be greater than&90°.
在信息检索的领域,余弦相似度的值的范围是从0到1,因为词频(tf-idf权重)不可能为负数.两个词频向量的夹角不可能大于90度.
三 &余弦相似度在文本相似中的应用
文本相似度计算的处理流程是:
1.对所有文章进行分词
2.分词的同时计算各个词的tf值
3.所有文章分词完毕后计算idf值
4.生成每篇文章对应的n维向量(n是切分出来的词数,向量的项就是各个词的tf-idf值)
5.对文章的向量两篇两篇代入余弦定理公式计算,得出的cos值就是它们之间的相似度了
This cosine similarity metric may be extended such that it yields the Jaccard coefficient in the case of binary attributes. This is the&Tanimoto coefficient,&T(A,&B),
represented as
余弦相似度的公式在二进制的情况下可以扩展到以Jaccard系数作为除数的值(分母).这是Tanimoto系数(广义Jaccard系数),T(A,&B),表示为
相信很多学习向量空间模型(Vector Space Model)的人都会被其中的余弦定理公式所迷惑..
因为一看到余弦定理,肯定会先想起初中时的那条最简单的公式cosA=a/c(邻边比斜边),见下图:
但是,初中那条公式是只适用于直角三角形的,而在非直角三角形中,余弦定理的公式是:
cosA=(c2&+
b2&- a2)/2bc
不过这条公式也和向量空间模型中的余弦定理公式不沾边,迷惑..
引用吴军老师的数学之美系列的里面的一段:
-------------------引用开始分界线------------------------
假定三角形的三条边为 a, b 和 c,对应的三个角为 A, B 和 C,那么角 A 的余弦
如果我们将三角形的两边 b 和 c 看成是两个向量,那么上述公式等价于
其中分母表示两个向量 b 和 c 的长度,分子表示两个向量的内积。
举一个具体的例子,假如新闻 X 和新闻 Y 对应向量分别是x1,x2,...,x64000 和y1,y2,...,y64000,
那么它们夹角的余弦等于
-------------------引用完毕分界线------------------------
高中那条公式又怎么会等价于向量那条公式呢?
原来它从高中的平面几何跳跃到大学的线性代数的向量计算..
关于线性代数中的向量和向量空间,可以参考下面两个页面:
在线性代数的向量计算的余弦定理中,
* 分子是两个向量的点积(),点积的定理和计算公式:
The dot product of two vectors&a&= [a1,&a2,
… ,&an] and&b&= [b1,&b2,
… ,&bn] is defined as:
点积(dot product),又叫内积,数量积..(Clotho注: product常见的是产品的意思,但在数学上是乘积的意思.)
* 分母是两个向量的长度相乘.这里的向量长度的计算公式也比较难理解.
假设是二维向量或者三维向量,可以抽象地理解为在直角坐标轴中的有向线段,如图:
d2&= x2&+
y2&& -&&& d = sprt(x2&+ y2)
d2&= x2&+
y2&+ z2&& -& & d = sprt(x2&+
y2&+ z2)
三维以上的维度很难用图来表示,但是再多维度的向量,也仍然可以用这条公式来计算:
dn2&= x12&+
x22&+ .. + xn2&&
-&&& dn&= sprt(x12&+
x22&+ .. + xn2)
在文本相似度计算中,向量中的维度x1,x2..xn其实就是词项(term)的权重,一般就是词项的tf-idf值.
而这条看上去很抽象的公式,其实就是为了计算两篇文章的相似度.
文本相似度计算的处理流程是:
1.对所有文章进行分词
2.分词的同时计算各个词的tf值
3.所有文章分词完毕后计算idf值
4.生成每篇文章对应的n维向量(n是切分出来的词数,向量的项就是各个词的tf-idf值)
5.对文章的向量两篇两篇代入余弦定理公式计算,得出的cos值就是它们之间的相似度了
确定字符串相似度的方法很多,本文根据作者多年从事数据挖掘工作的经验结合数据挖掘理论提出的相关解决方案,可以较好的解决中文字符串分析中的相似度比较问题。但技术的发展是不断前进的,相信未来还会有更好的方法来解决中文字符串相似度比较问题。读者如果有更好的想法或者发现本文算法中的不足,非常欢迎和本文作者联系。
《数据挖掘概念与技术》机械工业出版社
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:230513次
积分:3596
积分:3596
排名:第6206名
原创:168篇
转载:107篇
评论:33条苹果/安卓/wp
积分 56, 距离下一级还需 29 积分
道具: 彩虹炫, 雷达卡, 热点灯, 雷鸣之声, 涂鸦板, 金钱卡, 显身卡下一级可获得
权限: 自定义头衔
购买后可立即获得
权限: 隐身
道具: 金钱卡, 雷鸣之声, 彩虹炫, 雷达卡, 涂鸦板, 热点灯
请教各位大侠,我有一个SPSS问题需求帮助:
在用户电话号码、用户名称和用户ID号上,电话号码是字符型的,用户名和用户ID号均是字符型的。我要比较用户名是否与电话号码,用户ID号相同,如果三者相同,新生成一个字段标识为1,如果仅用户电话号码与用户名一致标识为2,如果三者均不一样标识为3,其余的标识为4
不知道在spss当中怎么实现。因为转换里面,找了一些函数,好像都不能够解决这个问题。
载入中......
用excel if函数很方便吧
论坛好贴推荐
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
如有投资本站或合作意向,请联系(010-);
邮箱:service@pinggu.org
投诉或不良信息处理:(010-)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师}

我要回帖

更多关于 字符串长度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信