"0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........"取出"|"之间的字符的算法!(100分)

  • 主题发起人 meng9999
  • 开始时间
我不是来和你吵架的,我的好心当了驴肝肺那没有办法。
就是这个if(!p)我原来也这么写。但是通过学习,我知道if(p!=Null)
才是正确的书写,好的程序员一看就是一个指针变量。
我希望我的程序清单在大师级的程序员面前也找不出毛病
现在都什么时代了,cpu都上了g了,花点时间没什么大不了的。
你多向高处学习吧,effective c++会对你有好处的。
 
我对c的精华指针,还是不很明白,有什么好书,大家请介绍介绍,大家一起来学c
了!!1
 
楼主的问题是一个简单的数据结构问题。可以用栈来解决。
先用结构体建立一个栈,顺序站就够了,delphi也能用。

typedef int detatype;
#define maxsize 64

typedef struct
{
datatype data [maxsize];
int top;
} stack;
stack *s;

0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........这个字符串提取“|”

一种方法就是spear提到的那种(尽管有习惯上的不足,但是算法是很好的)设一个while
循环,顺序读取数组的下标,0-...遇到“|”就删除下标提前,继续读。

我提到的是在输入的情况下,判断字符,利用栈的后进先出的好处来存。
EDIT()
{
char c;

c = getchar();
while (c != '*') //输入从不能无限吧,就用*吧
{
if (c == '|')
{
s->top--;//是它就去掉
return (s->data[s->top + 1);
}
else
{
s->top++;//不是就再来
s->data[s->top] = c;
}
c = getchar();
}
}
加上上面的结构体,就成了。是个笨办法。就像字典法验证密码一样。
 
reallike:不好意思,我c还是不很熟,但我正想把数据存到结够体中,
0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........
是我以知的一个字符;我只想一个一个的分开它们,把他们存到结够体的数组中;
spear的是一种方法;


 
我的你可以这么理解。就像一个杯子

| |<====== s->top这是个指针,指着上边。
| |
| |
|__________|下面是不许访问的。

每一个数据进栈就压到下面,判断是不是你符合的字符。
是就进去就是s->data[s->top] = c,把c的值赋到data结构的上边。
在把上标上移,s->top++;
如果是就把上标下移,就可以以覆盖形势删除了s->top--;
在返回被删的值return(s->data[s->top+1]);
这样一来,总是访问上面的,其实是最后一位数值。
我的解释明白么?8-)
 
怎么没有人了?
[:D][:D][:D][:D]
up
 
effective c++之外还有什么书,最好是全部说指针的和结购体的
最近在做那个东东是文件数据库的,所有的数据在内存中以结购体存着;
 
这个问题简单。。
 
嗷~~~~~~~~
有必要那么麻烦吗?
我给一个简单的,献丑了。嘻嘻^_^
设:Label1.Caption = "0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........"
  ListBox1用来存放拆解后的字符串,
  Button1嘛,嗷~~~~~~

Source:

procedure TForm1.Button1Click(Sender: TObject);
var
i:DWord;
cTemp:Char;
strTemp, str1:String;
begin
Caption := Label1.Caption;
Listbox1.Items.Clear;
strTemp := Label1.Caption;
str1 := '';
for i:=1 to Length(strTemp) do
begin
cTemp := strTemp;
if cTemp<>',' then
str1 := str1 + cTemp
else
begin
ListBox1.Items.Add(str1);
str1 := '';
end;
end;
end;
 
c的书就太多了。随便一个就不错。
 
以上的vb的delphi的c的都 !有了好象java的还没有呢!
go on啊;
同志们!!!
 
char * d="|";
char * p;
char recv_data[]="0002|aaaa|bbbb|cccc|dddd|....."

p=strtok(recv_data,d);

while(p != NULL )
{

strcpy(recv_msg.ms,p)
printf( " %s/n", p );
p = strtok( NULL, d );
i++
}
想把分出来的字符弄到数组中
加了strcpy(recv_msg.ms,p)
为什么出错!!!怎么改?
 
拜托,你定义了recv_msg[]了么?我怎么没有看见。
 
在前头定了;现在差不多搞定了;我把它们一个个的取出来,然后放到一个结构体里头;
在传递时我只传递结够体的地止,我对c的这种灵活性,还不是太习惯;c没有string;
只有字符数组,不习罐啊;
thank reallike
thank all;

 
"0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........"?
这种格式本身就会有错误。建议改为"|0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........|"
 
zfmich:
为什么呢?给个理由先!各位以前定网络接口时都是用什么方法?
 
给你一个自己写的单元文件

{
单元名称:工具单元 Ver 1.0
功能:公用单元
更新日期:2002.6.19
作者:95927
}

unit ToolsUnit;

interface

function StrLeft(const mStr: String; mDelimiter: String): String;
function ListCount(mList: String; mDelimiter: String =','): Integer;
function ListValue(mList: String; mIndex: Integer; mDelimiter: String =','): String;

implementation

//============================ StrLeft =====================================//
function StrLeft(const mStr: string; mDelimiter: string): string;
{ 返回左分隔字符串 }
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end;

//=========================== ListCount =====================================//
function ListCount(mList: string; mDelimiter: string ): Integer;
{ 返回列表数 }
var
I, L: Integer;
mListC:String;
begin
Result := 0;
if mList = '' then Exit;
mListC := mList;
L := Length(mList);
I := Pos(mDelimiter , mList);
while I > 0 do begin
mList := Copy(mList , I + Length(mDelimiter), L);
I := Pos(mDelimiter , mList);
Inc(Result);
end;
Inc(Result);
if PChar(mListC)[0] = mDelimiter then
Result := Result - 1;
if PChar(mListc)[Length(mListc)-1] = mDelimiter then
Result := Result - 1;
end;

//============================= ListValue ==================================//
function ListValue(mList: string; mIndex: Integer; mDelimiter: string = ','): string;
{ 返回列表指定位置的元素 }
var
I, L, K: Integer;
begin
if Pchar(mList)[Length(mList)-1] <> mDelimiter then
mList:=mList + mDelimiter;
L := Length(mList);
I := Pos(mDelimiter, mList);
K := 0;
Result := '';
while (I > 0) and (K <> mIndex) do begin
mList := Copy(mList, I + Length(mDelimiter), L);
I := Pos(mDelimiter, mList);
Inc(K);
end;
if K = mIndex then
Result := StrLeft(mList + mDelimiter, mDelimiter);
end;

end.


用的时后用ListCount取出有多少个分割块,然后用For循环就可以了
 
var
tmpStr : string;
begin
//连接所有字符串
tmpStr := '0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........';
tmpStr := StringReplace(tmpStr, '|', '', [rfReplaceAll]);
Label1.Caption := tmpStr;

//两个'|'之间的串不在同一行
tmpStr := '0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........';
tmpStr := StringReplace(tmpStr, '|', #13#10, [rfReplaceAll]);
Memo1.Text := tmpStr;
 
sorry,
其实我说的是,我在碰到这个问题时,因为有用 like '|salgjl|'来查询,如果此时不加‘|’
的话,结果肯定不正确。
如果你没有用这方面的需要的话,只是每次把字符串一个一个取出来的话,应该是不会有问题的,:)
 
还是没有java的。
 
顶部