不用strrev函数解决字符串逆序?
之所以不能用strrev函数这个问题,我想说的就是因为在linux编译时,老出现
In function 'msqlInsert':
undefine reference to 'strrev'
collect 2:ld returned 1 exit status
这样的错误,尽管我在前面申明#include <string.h>也不行。因为不能使用字符串函数(至少是不能用原程序没用过的字符串函数——原因还不明确),我只能用其他方法来替代了。首先把两个结构写出来。
[code]typedef struct field_ps {
char table[NAME_LEN+1],
name[NAME_LEN+1];
val_t *value;
int type,
length,
null,
flags;
strcut field_ps *next;
}field_t;
typedef struct val_s {
union val_u {
int intVal;
u_char *charVal;
double realVal;
indent_t *identVal;
}val;
int type,
nullVal,
dataLen;
}val_t;[/code]
一下这个是我针对msqIinsert函数写的整型数据+1操作的程序段
[code]int msqlInsert(table,fields,DB)
char *table;
field_t *fields;
char *DB;
{ int flist[MAX_FIELDS],
rowLen,
useKey;
u_int rowNum;
u_char *row;
REG field_t *curField,
*curField2;
pkey_t *key;
cache_t *cacheEntry;
。。。
。。。
/********************************************/
curField=fields;
while(curField)
{
if(!curField->value->nullVal)
{
switch(curField->type)
{
case INT_TYPE:
curField->value->val.intVal+=1;
break;
/* case CHAR_TYPE:*/
}
}
curField=curField->next;
}
/*******************************************/
。。。
。。。
}[/code]
大家可以看到,我使用了一个该函数自己申明的一个field_t结构的指针变量curField(函数内部它自己申明的,我只是借用)来存储首地址,从而通过修改curFiled->value->val.intVal的值来达到修改目的。
我现在希望的是,在case char_TYPE那里添加一小段程序,使对CHAR_TYPE类型的数据,实现逆序存储。根据我看其他函数程序段,对strlen这这个字符串函数是支持的,这个很重要:),我对C丢了太久了,不知道怎么实现使代码最优?
如果对我的前面的话不明白,可以的话,跟我邮箱联系benleexi@sohu.com
问题点数:100、回复次数:9Top
1 楼stukov2002(卡拉是头猪)回复于 2003-06-02 13:17:02 得分 100
在开头定义如下变量:
int nLen; // curField->value->val.charVal的长度
int nIndex; // 下标
u_char *p; // 指针
u_char ch; // 临时存储字符
在case char_TYPE添加如下程序:
p = curField->value->val.charVal;
nLen = strlen(p);
nIndex = 0;
while(nIndex < nLen / 2)
{
ch = *(p + nIndex);
*(p + nIndex) = *(p + nLen - nIndex - 1);
*(p + nLen - nIndex - 1) = ch;
nIndex ++;
}
break;
对于奇数和偶数长度的字符串均有效.
Top
2 楼arfi()回复于 2003-06-02 13:17:43 得分 0
//字符串逆转函数
char *strrev(char *str)
{
char *bp, *ep, temp;
bp = ep = str;
while(*ep != '\0')
ep++;
ep--;
for(; bp<ep; bp++, ep--)
{
temp = *bp;
*bp = *ep;
*ep = temp;
}
return str;
}
然后在你的就可以用在你的case中了。
case char_TYPE:
strrev(curField->value->val.intVal);
...
break;Top
3 楼FBStudio(飞鸟)回复于 2003-06-02 13:19:57 得分 0
char* mystrrev(char *str)
{
char ch, *ph, *pt;
int l;
l = strlen(str);
if (l >= 2)
{
ph = str;
pt = str + l - 1;
while (ph < pt)
{
t = *ph;
*ph = *pt;
*pt = ch;
ph++;
pt--;
}
}
return str;
}Top
4 楼Afo1st(飞经南天)回复于 2003-06-02 13:44:32 得分 0
我的代码,权衡一下他们的效率优化问题
int reverse( char* str )
{
static char* tmp;
int i, j;
i = 0;
j = ( strlen( str ) - 1 );
tmp = malloc( strlen( str ) );
memset( tmp, 0, strlen( str ) );
/* Copy string to tmp */
memcpy( tmp, str, strlen( str ) );
for( ; i < strlen( str ); i++ )
{
str[i] = tmp[j];
j--;
}
return 0;
}Top
5 楼Clerk_9919(Clerk)回复于 2003-06-02 14:38:59 得分 0
哦???
我怎么好像刚刚在linuxeden看到你了??
今天,不知道运气会怎么样!!
^_^Top
6 楼Clerk_9919(Clerk)回复于 2003-06-02 14:47:42 得分 0
TO: 楼主
哦???
我怎么好像刚刚在linuxeden看到你了??
今天, 不知道运气会怎么样!!
^_^Top
7 楼benleexi(瘦子)回复于 2003-06-02 18:15:38 得分 0
我哭,完了,不会给分,给了才知道,不能每个人给100的!555555,偶只给了卡拉100分!
偶的确是有很多分——但是不知道总给分为100,arfi() 、Clerk_9919(Clerk) 、FBStudio(飞鸟) 你们三位没有得到分的朋友,我另开帖子给你们分,这次不会错了,偶再开一个帖子,再给你们分——5555,实在对不起——我拼了要被封号也好对的起自己的良心。Top
8 楼benleexi(瘦子)回复于 2003-06-02 18:18:28 得分 0
Clerk_9919(Clerk),你在伊甸园帮了偶的忙,谢谢,这个分偶一定要散出来的。大家不急。。欢迎捧场,卡拉兄弟,偶觉得给你100分偶也不亏,谢谢捧场....Top
9 楼benleexi(瘦子)回复于 2003-06-02 18:26:42 得分 0
非技术区可以给分吧?如果可以就请三位到非技术去接分——再次抱歉Top




