排序检索-156 Ananagrams-待处理问题为char** p、 char (*p) [n]、char *p[n]的异同

题目大意:给一串单词,找出不能依靠变换字母顺序就得到新的单词的单词

解题过程:本次qsort  char二维数组成功!!!!

值得注意的是



int cmpchar(const void * a,const void * b){
	return strcmp(*(char(*)[30])a,*(char(*)[30])b);
}


与网上的*(char**)a-*(char**)b不同。我的char二维数组定义为:char (*result)[30]=new char[numofword-start][30];后经过尝试发现:二维数组定义为char result[1005][30];  应用cmpchar()进行快排也是正确的。

char** p、 char (*p) [n]、char *p[n]是不同的,但是具体哪里不同还在体会中。。。

易错点:由于输入时大小写不限定,有时候会出现 exit 和 Exit的情况,但这种不算字母重组,要去掉

正确代码:

# include <cstdio>
# include <cstdlib>
# include <ctime>
# include <cmath>
# include <iostream>
# include <fstream>
# include <cstring>
# include <string>

//*
#define fin cin
#define fout cout
//*/

using namespace std;

/*
ifstream fin("in.txt");
ofstream fout("out.txt");
//*/
int cmp(const void* a,const void * b){
	return (*(char*)a)-(*(char*)b);
}
/*
int cmpchar(const void* a,const void*b){
	char* sa=(char*)a;
	char* sb=(char*)b;
	for(int i=0;i<min(strlen(sa),strlen(sb));i++){
		if(sa[i]<sb[i]) return -1;
		if(sb[i]<sa[i]) return 1;
	} 
	if(strlen(sa)>strlen(sb)) return 1;
	if(strlen(sb)>strlen(sa)) return -1;
	return 0;
}
void sort(char (*s)[30],int num){
	char temp[30];
	for(int i=0;i<num;i++){
		for(int j=num-1;j>i;j--){
			if(cmpchar(s[i],s[j])>0){
				strcpy(temp,s[i]);
				strcpy(s[i],s[j]);
				strcpy(s[j],temp);
			}
		}
	}
}
//*/

//*
int cmpchar(const void * a,const void * b){
	return strcmp(*(char(*)[30])a,*(char(*)[30])b);
}
//*/
/*
int cmpchar(const void * a,const void * b){
	return strcmp(*(char**)a,*(char**)b);
}
*/
struct word{
	char origine[30];
	char lower[30];
	char transf[30];
	word(){
		strcpy(origine,"");
		strcpy(transf,"");
	}
	void tf(){
		for(int i=0;i<strlen(origine);i++){
			lower[i]=transf[i]=tolower(origine[i]);
		}
		transf[strlen(origine)]='\0';
		lower[strlen(origine)]='\0';
		qsort(transf,strlen(transf),sizeof(transf[0]),cmp);
	}
};
word words[1005];

int cmpword(const void * a,const void * b){
	if(strcmp((*(word*)a).transf,(*(word*)b).transf)!=0)
	 return strcmp((*(word*)a).transf,(*(word*)b).transf);
	 else	return strcmp((*(word*)a).lower,(*(word*)b).lower);
}
char result[1005][30];
int main()
{
	int numofword=0,numofresult=0;
	char temp[30];
	fin>>temp;
	while(strcmp(temp,"#")!=0){
		strcpy(words[numofword].origine,temp);
		words[numofword].tf();
		numofword++;
		fin>>temp;
	}
	qsort(words,numofword,sizeof(words[0]),cmpword);

	for(int i=0;i<numofword-1;){
		strcpy(temp,words[i].lower);
		for(int j=i;j<numofword-1;j++){
			if(strcmp(temp,words[j+1].lower)==0){
				strcpy(words[j].transf,"");
				strcpy(words[j].lower,"");
			}
			else{
				i=j+1;
				break;
			}
		}
	}
	qsort(words,numofword,sizeof(words[0]),cmpword);

	int start=0;

	for(int i=0;i<numofword;i++){
		if(strcmp(words[i].transf,"")!=0){
			start=i;
			break;
		}
	} 

//	char *result=new char*[numofword-start];
	if(numofword-start==1) fout<<words[start].origine<<endl;
    else{
    	if(strcmp(words[start].transf,words[start+1].transf)!=0){
    		strcpy(result[numofresult++],words[start].origine);
		}
    	for(int i=start+1;i<numofword-1;i++){
			if(strcmp(words[i-1].transf,words[i].transf)!=0&&strcmp(words[i].transf,words[i+1].transf)!=0){
				strcpy(result[numofresult++],words[i].origine);
			}
		}
		if(strcmp(words[numofword-2].transf,words[numofword-1].transf)!=0){
    		strcpy(result[numofresult++],words[numofword-1].origine);
		}
	}	
//	sort(result,numofresult);
qsort(result,numofresult,sizeof(result[0]),cmpchar);
	for(int i=0;i<numofresult;i++){
		fout<<result[i]<<endl;
	}
	return 0;
 } 


<think>我们正在讨论NXOpenAPI中的函数UF_DRF_ask_dimension_text。这个函数用于检索NX工程图中尺寸标注的文本内容。函数原型(C语言):intUF_DRF_ask_dimension_text(tag_tdimension_tag,//输入:尺寸标注的标签char**dim_text//输出:尺寸文本(需要调用UF_free释放内存));参数说明:dimension_tag:要查询的尺寸标注对象的标签(tag)。dim_text:返回的尺寸文本字符串。这个字符串是通过NXOpenAPI分配的内存,使用后需要调用UF_free来释放,以避免内存泄漏。返回值:0表示成功,非0表示错误(错误代码可以参考NXOpenAPI文档)。使用步骤:1.获取尺寸标注的tag(例如,通过选择或遍历图纸中的尺寸)。2.声明一个char*变量用于接收文本。3.调用UF_DRF_ask_dimension_text函数,传入尺寸tag和该变量的地址。4.如果返回0,则可以使用返回的文本字符串。5.使用完毕后,调用UF_free释放文本字符串所占用的内存。注意:在NXOpen中,所有通过API返回的字符串(char*)都需要手动释放,除非文档特别说明。示例代码(C语言):#include<uf.h>#include<uf_drf.h>voidget_dimension_text(tag_tdim_tag){char*text=NULL;intresult=UF_DRF_ask_dimension_text(dim_tag,&text);if(result==0){//成功获取文本printf("Dimensiontext:%s\n",text);//释放内存UF_free(text);}else{//处理错误printf("Failedtogetdimensiontext.Errorcode:%d\n",result);}}相关问题:1.如何获取尺寸标注的tag?2.在NXOpen中如何遍历图纸中的所有尺寸标注?3.如何修改尺寸标注的文本?是否有相应的函数?4.UF_DRF_ask_dimension_text返回的文本格式是怎样的?是否包含尺寸公差等信息?5.在NXOpen中处理字符串时需要注意哪些内存管理问题?注意:由于NXOpenAPI主要使用C语言,因此在其他语言(如C++、VB.NET、C#)中调用时,需要根据语言特性进行适当调整。例如,在C#中,需要使用DllImport并正确处理字符串内存。</think>### UF_DRF_ask_dimension_text 函数详解 `UF_DRF_ask_dimension_text` 是 Siemens NX Open API 中的一个关键函数,用于获取工程图中尺寸标注的文本内容。以下是详细说明: #### **函数原型** ```c extern int UF_DRF_ask_dimension_text( tag_t dimension, // [输入] 尺寸标注对象的标签 char **dim_text // [输出] 尺寸文本内容(需手动释放内存) ); ``` #### **参数说明** 1. **`dimension`** - 类型:`tag_t`(无符号整数) - 作用:目标尺寸标注对象的唯一标识符(标签)。 - 获取方式:通过选择操作或遍历图纸视图获得(如 `UF_VIEW_ask_dimensions`)。 2. **`dim_text`** - 类型:`char**`(二级指针) - 作用:返回尺寸文本的字符串指针。 - **内存管理**- 文本内存由 NX API 自动分配 - 使用后必须调用 `UF_free(*dim_text)` 手动释放内存 - 未释放会导致内存泄漏 #### **返回值** - `0`(`UF_UI_OK`):成功获取文本 - 非 `0` 值:错误代码(参考 `uf_err.h`) 常见错误: - `UF_UI_BAD_OBJECT_TAG` (5):无效尺寸标签 - `UF_UI_NO_OBJECT` (140000):空对象 --- #### **使用流程** ```c #include <uf.h> #include <uf_drf.h> void get_dim_text(tag_t dim_tag) { char* text = NULL; // 初始化文本指针 int status = UF_DRF_ask_dimension_text(dim_tag, &text); if (status == 0 && text != NULL) { // 成功获取文本 printf("尺寸文本: %s\n", text); UF_free(text); // 必须释放内存! } else { printf("错误代码: %d\n", status); } } ``` #### **关键注意事项** 1. **文本格式** - 返回文本包含尺寸值、公差和符号(如 `Ø10.0±0.1`) - 不包含尺寸线/延伸线等图形信息 2. **关联对象** - 需先通过 `UF_DRF_ask_objects` 获取尺寸关联的几何体 - 文本位置需用 `UF_DRF_ask_text_origin` 获取 3. **多语言支持** - 文本语言与当前 NX 会话语言一致 - 中文环境下返回中文字符(如 `直径` 代替 `Diameter`) 4. **特殊尺寸** - 坐标尺寸:返回多行文本(需解析换行符 `\n`) - 参考尺寸:文本包含 `REF` 前缀 --- ### 相关问题 1. 如何获取工程图中所有尺寸标注的标签? 2. 如何修改尺寸标注的文本内容?是否有对应函数? 3. 解析尺寸文本时,如何处理公差符号(如 `±`/`⌀`)的编码问题? 4. 调用 `UF_DRF_ask_dimension_text` 后忘记释放内存会导致什么后果? 5. 如何通过尺寸文本反向定位到模型中的对应特征? [^1]: NX Open C API Reference - DRF Module
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值