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

  • 主题发起人 meng9999
  • 开始时间
枫 的方法不错哦! :)
 
哇,夸张点,简直是无所不用其极啊。
 
以下是c的写法
char * d="|";
char * p;
char recv_data[]="0002|aaaa|bbbb|cccc|dddd|....."

p=strtok(recv_data,d);

while(p != NULL )
{
printf( " %s/n", p );
p = strtok( NULL, d );
}
结果是
0002
aaaa
bbbb
cccc
dddd
 
c中短短的几杭代码,就可分开来,不过它借助c中的strtok这个函数,还有灵活的指针!
 
这个方法最大的坏处就是无法在多线程环境下使用.
strtok函数内部使用了静态变量
若想在多线程中使用则可考虑使用strchr来定位'|'
或者完全不使用c库,自己循环字符串
#include <stdio.h>
#include <string.h>

void f(char* s)
{
char *p = s;
while (*s++) {
if (*s != '|') continue;
*s = 0;
s++;
printf("%s/n", p);
p = s;
}
}

void main()
{
char s[1000];
strcpy(s, "0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........|");
f(s);
}
 
delphi里面有函数extractstrings
 
spear 有一个简单的问题;
printf("%s/n", p);是printf出来;
我想我每一个结果存在数组中:
c中怎样存?
今早我想存在一个结钩体中
struct recv_data
{
char recv_msg_data[20];
};
引用的时候
struct recv_data recv_msg[3];
recv_msg[0].recv_msg_data="....";
可是老是出错
error C2106: '=' : left operand must be l-value
不知怎办!
 
C中不能这样给字符串赋值,需要用strcpy等
 
在c中
那我把"0003|aaaa|bbb|ccccc|...."中分离出的字符付给一个数组应该怎么办!!!
 
int String2Array( char * p, char del, char * q, char * ptr[], short max )
{
if ( !p )
return -1;
if ( * p == 0 )
return 0;
int k = 0;
ptr[k] = q;
while ( * p )
{
*q = *p++;
if ( *q == del )
{
*q = 0;
if ( k++ < max )
ptr[k] = q + 1;
}
q ++;
}
*q = 0;
return k + 1;
}
 
呵,看了办法才知道,你们给的都是D6的函数,难怪当初我要自己写~哈哈~~
 
希望能交到更多的用过delphi和c的朋友!
一个在上海的程序员
qq 66177364
谢谢spear
 
楼上的矛同志,你的代码有问题我看不太懂。有很多地方写得很不严谨。

比如:*p==0,p是指针,空值应该是NULL。
if ( k++ < max ),尽管变量少是写程序的原则,但是也不要省略吧。

建议看看林锐博士的《高质量c++》,和《effective c++》

防备于隐患,上边的小错误,小毛病或许会酿成大错。虽然是C的毛病。

可是delphi的程序员也要注意。
 
有谁用过PHP?

在PHP中有函数的,好像是exclude(我忘了,大致是这样拼地)??

PHP用的是C语法,我想在C 中会不会也有呢?
 
reallike学过c吗?
if (!p) ----判断p是空指针
if (*p == 0) -- 判断p是空串
 
PHP的确有此函数

strtok
 
问题:&amp;quot;0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........&amp;quot;取出&amp;quot;|&amp;quot;之间的字符的算法! ( 积分:100, 回复:32, 阅读:235 )
分类:数据库-C/S型 ( 版主:千中元, luyear )
来自:meng9999, 时间:2002-8-2 12:08:00, ID:1237847 [显示:小字体 | 大字体]
请问"0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........"取出"|"之间的字符的算法!
字符串长度不定;要求取出其中的字符;本来是用c写的,但我想了大半天,想不出!
所以回到老地方,向各问请教!
可以用的语言c,delphi,java来写!,我的qq 66177364! meng9999@371.net!
谢谢大家!



来自:honghs, 时间:2002-8-2 12:20:00, ID:1237883
"0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........"
var
tmpstr:string;
i:integer;
strlst:tstrings;
begin
tmpstr:='0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........';
if tmpstr[lenfth[tmpstr]<>'|' then tmpstr:=tmpstr+'|';
i:=pos('|',tmpstr);
strlst:=tstringlist.create;
try
while i<>-1 do
begin
strlst.add(copy(tmpstr,1,i -1 );
tmpstr:=copy(tmpstr,i+1,length(tmpstr);
i:=pos('|',tmpstr);
end
finally
strlst.free;
end;


来自:honghs, 时间:2002-8-2 12:22:00, ID:1237887
我直接在浏览器上写的,可能有点问题,你将就着改改吧,至于在字符串后面加上'|'中为了
循环判断方便一点。


来自:svw0506, 时间:2002-8-2 12:37:00, ID:1237924
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;



来自:yanghai0437, 时间:2002-8-2 13:04:00, ID:1238016
下面是VB代码,你试着改成delphi的吧
Public Pubstring() As String '分割字符串后保存的字符串数组
' #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
' 功能:ParseString:分割用","分开的字符串到公用数组
' 参数:
' StringToParse 要分割的字符串
' Delimiter 用来分隔字符的符号,默认是逗号
' 返回值:分割后的字符按顺序存储在动态数组中Pubstring
' #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
Public Sub ParseString(StringToParse As String, _
Optional Delimiter As String = ",")


Dim lngStartPos As Long
Dim lngNextPos As Long

Dim strtemp As String
Dim i As Integer

lngStartPos = 1
i = 1

Do



' Search the string
lngNextPos = InStr(lngStartPos, StringToParse, Delimiter)

If lngNextPos = 0 Then
' For when we get to the end of the file
strtemp = Mid$(StringToParse, lngStartPos, Len(StringToParse) - lngNextPos)
Else
strtemp = Mid$(StringToParse, lngStartPos, lngNextPos - lngStartPos)
End If

lngStartPos = lngNextPos + 1

ReDim Preserve Pubstring(i)
Pubstring(i - 1) = Trim(strtemp)
i = i + 1

DoEvents

Loop Until lngNextPos = 0
ReDim Preserve Pubstring(i - 1)
End Sub


来自:blue_morning, 时间:2002-8-2 13:05:00, ID:1238017
//将字符串按指定的分隔符拆到列表中保存, ANull表示当两个分隔符没有间隔时
//使用ANull值加入到列表中, 返回分隔符没有间隔的次数
function SplitString(AString, ABreakSymbol, ANull: string;
AList: TStringList): Integer;
var
p1: Integer;
p2: Integer;
s: string;
ReplaceS: Char;
iCount: Integer;
begin
AList.Clear;
iCount := 0;
//临时的分隔符
ReplaceS := #5;
AString := AString + ABreakSymbol;
p1 := 1;
while Pos(ABreakSymbol, AString) > 0 do
begin
p2 := Pos(ABreakSymbol, AString);
AString[Pos(ABreakSymbol, AString)] := ReplaceS;
s := Copy(AString, p1, p2 - p1);
p1 := p2 + 1;
//利用两次出现BreakSymbol的位置取出相应的字符串
if (s = ABreakSymbol) or (s = '') then
begin
s := ANull;
Inc(iCount);
end;
AList.Add(s);
end;
Result := iCount;
end;



来自:blue_morning, 时间:2002-8-2 13:11:00, ID:1238037
好人当到底吧
//将一个字符串列表中的字符串列表按分隔符合并为一个字符串返回,默认的分隔符为空
function UniteString(AList: TStrings; CompartSymbol: string = ''): string;
var
i: Integer;
s: string;
begin
for i := 0 to AList.Count - 1 do
s := s + AList.Strings + CompartSymbol;
Result := Copy(s, 1, Length(s) - Length(CompartSymbol));
end;



来自:天真, 时间:2002-8-2 13:19:00, ID:1238051
不要用写算法呀,直接有函数
ExtractStrings(['|'],['|'],’0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........‘,strs);
strs是STRINGLIST,一切就OK了


来自:hello8, 时间:2002-8-2 13:42:00, ID:1238100
Note: ExtractStrings does not add empty strings to the list.
如果是'0009||||afdsfds|dgfdg|gfgf||fgfg|',是不是就不会得到应该得到的字符串个数呢?


来自:meng9999, 时间:2002-8-2 15:21:00, ID:1238417
以上代码有vb的有delphi的,有哪位写出c的,我最终是用c的,但我一下写不出来;
只好想通过delphi的改为c的,但有java的也可以,语言无关性,希望大家一起来
学习!!


来自:haisongzhang, 时间:2002-8-2 15:37:00, ID:1238445
先定义一个字符串数组,长度随意,且每个值都为空,
根据字符串的长度确定循环次数,挨个判断字符串中
每个字符,如果字符不是|,字符一直写入数组中的
某一个数值中,如果是|,当前数组的数值结束,进入
下一个数组的值。


来自:newhear, 时间:2002-8-2 17:02:00, ID:1238680
要处理好空字符串


来自:yeskert1, 时间:2002-8-2 17:19:00, ID:1238762
1、获得第一个和第二个'|'位置,取出第一个字符;
2、截取
3、重复1和2
4、剩下的是最后一个(如果不为空的话)


来自:Nizvoo, 时间:2002-8-2 17:27:00, ID:1238790
谢谢天真,我刚准备贴代码啊。
ExtractStrings


来自:linsb, 时间:2002-8-2 17:36:00, ID:1238816
procedure TForm1.Button8Click(Sender: TObject);
var
temp : String ;
a_Stringlist :TStringList;
i:integer;
begin
a_Stringlist:=TStringList.Create;
temp:='0009|sssss|sfasfsd|fasdfsd|lll|fasfsd';
i:=pos('|', temp);
while i<>0 do begin
a_StringList.add(copy(temp, 1, i - 1));
temp := copy(temp, i + 1, length(temp) - i);
i:=pos('|', temp);
end;
end;


来自:天真, 时间:2002-8-2 17:37:00, ID:1238821
function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar;
Strings: TStrings): Integer;
var
Head, Tail: PChar;
EOS, InQuote: Boolean;
QuoteChar: Char;
Item: string;
begin
Result := 0;
if (Content = nil) or (Content^=#0) or (Strings = nil) then Exit;
Tail := Content;
InQuote := False;
QuoteChar := #0;
Strings.BeginUpdate;
try
repeat
while Tail^ in WhiteSpace + [#13, #10] do Inc(Tail);
Head := Tail;
while True do
begin
while (InQuote and not (Tail^ in ['''', '"', #0])) or
not (Tail^ in Separators + [#0, #13, #10, '''', '"']) do Inc(Tail);
if Tail^ in ['''', '"'] then
begin
if (QuoteChar <> #0) and (QuoteChar = Tail^) then
QuoteChar := #0
else QuoteChar := Tail^;
InQuote := QuoteChar <> #0;
Inc(Tail);
end else Break;
end;
EOS := Tail^ = #0;
if (Head <> Tail) and (Head^ <> #0) then
begin
if Strings <> nil then
begin
SetString(Item, Head, Tail - Head);
Strings.Add(Item);
end;
Inc(Result);
end;
Inc(Tail);
until EOS;
finally
Strings.EndUpdate;
end;
end;
这就是DELPHI自带的,你看看


来自:Nizvoo, 时间:2002-8-2 17:39:00, ID:1238834
呵呵。


来自:lbd, 时间:2002-8-2 17:47:00, ID:1238859
[8D]


来自:SupermanTm, 时间:2002-8-3 4:13:00, ID:1239622
procedure ExtractStrings(const SourceStr, Separator: String; var Str: TStrings);
var
S: String;
P: PShortString;
SprLen, X: Integer;
begin
S:= SoruceStr + Separator + #0;
Str.Clear;
X:= Pos(Separator, S);
SprLen:= Length(Separator) - 1;
Str.Add(Copy(S, 1, X - 1);
while S[X+SprLen+1] <> #0 do begin
P:= @S[X+SprLen];
P^[0]:= #255;
X:= Pos(Separator, P^);
if X = 0 then Break;
P^[0]:= Chr(X - 1);
Str.Add(P^);
end;
end;



来自:枫, 时间:2002-8-3 9:42:00, ID:1239802
呵呵,我也来贴一个

var
tmp:TStringList;
begin
tmp:=TStringList.Create
tmp.Delimiter:='|';
tmp.DelimitedText:='0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|'
//tmp.Strings[0]=='0009'
end;
end;

此代码中的“Delimiter”是什么哦,看了帮助没有这个函数的啊
 
to 矛:
c是基础怎么没有学?
指针变量的零值是“空”(记为NULL)。尽管NULL 的值与0 相同,但是两者意义不
同。假设指针变量的名字为p,它与零值比较的标准if 语句如下:
if (p == Null) //p 与NULL 显式比较,强调p 是指针变量
if (p != Null)

if (p ==0) //容易让人误解p 是整型变量
if (p !=0)

if (p) //容易让人误解p 是布尔变量
if (!p)

又,程序清单是给别人看得,你写的模棱两可,别人怎么看得懂?

更何况,其中的隐患会叫你的程序bug多多。
 
隐患?你能指出我的程序哪里有隐患吗?
我这程序可是实际运行过不下二十个项目,从未见出错。我们的c程序拿到用友去,他们
都觉得写得好:)
你知道这种程序最重什么吗?效率!因为这种程序每天都可能运行几百万次。
你知道为什么少用变量吗?因为分配空间是最耗时的操作。
 
顶部