把字符串“|200|5000|2|88|345|” 怎么以数组元素的形式装入:a[]={200,5000,2,88,345}

xjb922 2008-06-23 08:24:53
把字符串 char *p="|200|5000|2|88|345|" 怎么以数组元素的形式装入:int a[]={200,5000,2,88,345}
请帮助下 谢谢各位!
...全文
311 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjb922 2008-06-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yyyapple 的回复:]
C/C++ code#include <stdio.h>
#include <stdlib.h>

#define MAXTOKS 10

char *Tok[MAXTOKS];
int array[MAXTOKS];

int str_to_array(char* str, int* array)
{
int i=0;
for(;i<MAXTOKS;i++) Tok[i]=0;

int nToks =0, n=0;
while(*str && nToks<MAXTOKS) {
if('|'==*str) {
*str = '\0';
str++;
Tok[nToks]=str; …
[/Quote]
为啥只给你4分啊 因为你写的不精确! 切编程风格不好!
if('|'==*str) {
*str = '\0';
str++;
Tok[nToks]=str;
nToks++;
}
str++;
你学要写个ELSE
{
str++;

}
小小郭丹丹 2008-06-24
  • 打赏
  • 举报
回复
动态的:
strtok

atoi

静态的:
sscanf
xjb922 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 xjb922 的回复:]
引用 24 楼 solew 的回复:
试一下这段代码

#include <string.h>
#include <stdio.h>
int main()
{
int len=0;
char s[20]="Golden Global View";
char *d=" ";
char *p,*s_p;
len = strlen(d);
s_p = s;
while(s_p)
{
if((p = strstr(s_p,d))!=NULL)
*p='\0';
printf("%s\n",s_p);

[/Quote]

--------------------Configuration: 123 - Win32 Debug--------------------
Compiling...
123.cpp
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/123.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

123.exe - 2 error(s), 0 warning(s)

============================================================================

刚才想新建一个VC++ Console的程序,试验一下自己想的代码。
但没注意,在创建的时候应该是误选择了“Win32 Application”,而不是想要的“Win32 Console Application”。所以即使只写void main(){}这条语句都不能通过“链接”(编译能通过),出错信息如上面。

找了半天,开始以为是Project Settings里面的C++选项卡下的Code Generation中的毛病,或者是Precompiled Haders中的毛病,再者是Link选项卡中出了毛病,但改了一些地方,就是不好使!汗啊!~

最后终于发现出错的地方了,选择“Win32 Application”,
1.在C++Preprocessor中processor definitions中的设置是“WIN32,_DEBUG,_WINDOWS,_MBCS”
2.而在Link选项卡下,最下面的Project options中的内容是“kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/123.pdb" /debug /machine:I386 /out:"Debug/123.exe" /pdbtype:sept ”

注意两处:
_WINDOWS

/subsystem:windows
将这两处改成_CONSOLE和/subsystem:console就可以解决问题了。

其实这就是将“Win32 Application”改成了“Win32 Console Application”。

呵呵,没想到一次失误到学到了一点知识!~

  • 打赏
  • 举报
回复
strtok??????????????
学习了……o(∩_∩)o...哈哈
xjb922 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 solew 的回复:]
试一下这段代码

#include <string.h>
#include <stdio.h>
int main()
{
int len=0;
char s[20]="Golden Global View";
char *d=" ";
char *p,*s_p;
len = strlen(d);
s_p = s;
while(s_p)
{
if((p = strstr(s_p,d))!=NULL)
*p='\0';
printf("%s\n",s_p);
if(p!=NULL)

[/Quote]

-------------------Configuration: ggx - Win32 Debug--------------------
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/ggx.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

ggx.exe - 1 error(s), 0 warning(s)

vs6 Link 错误啊!
Cf251Suzsoft 2008-06-24
  • 打赏
  • 举报
回复


token = strtok_s(p,seps,&nextToken);
while (token != NULL)
{
int i = atoi(token);
token = strtok_s(NULL,seps,&nextToken);
}

xjb922 2008-06-24
  • 打赏
  • 举报
回复


int nToks =0;
int i=0;
int n=0;
for(;i<MAXTOKS;i++)
{
Tok[i]=0;
}
是VC++6 编译.C 文件 这样对
在VC++ 里面一个块里面的最上面必须先定义变量 如果是.C
不能把变量 乱放
int i=0;
int n=0;
for(;i<MAXTOKS;i++)
{
Tok[i]=0;
}
int nToks =0;
这样错
别的编译器我没有实验
for(;i<MAXTOKS;i++)
{
Tok[i]=0;
}即使我的FOR 没有用 也错
但是你保存为.CPP 就是对的

xjb922 2008-06-23
  • 打赏
  • 举报
回复
willa815 朋友 写的很好! 基本工比较扎实!
willa815 2008-06-23
  • 打赏
  • 举报
回复
strtok是用来进行分割字符串的,原型是extern char *strtok(char *s, char *delim);

注意!!!!!!!

1) strtok分割的时候不是讲delim作为一个整体分割符来进行的,而是只要出现在delim中的字符都作为分割符来进行分割,把所有在delim中出现的符号都更改为'\0'。

2) 运行完这个函数之后,s的值也被改动了,所以如果想要保留原来的值的话就应该做出一个副本进行修改。

第一次调用的时候,s指向要分解的字符串,delim指向分割的字符串

在这里的s必须是一个已经分配了内存空间的指针,而不能是没有分配空间而指向常量位置的指针。

一般来说使用strtok的时候都要调用两次,第一次是在字符串s中将delim出现的位置都设成'\0'

第二次调用的时候是采用strtok(NULL,delim)的方式来对刚才分割的字符串进行遍历,以分别得到相对应的字符串。
willa815 2008-06-23
  • 打赏
  • 举报
回复
#include <string.h>
#include <stdio.h>
int main()
{
char s[20]="Golden Global View";
char *d=" ";
char *p;
char*ss = new char[20];
p=strtok(s,d);
while(p!=NULL)
{
strcpy(ss,p);
printf("%s\n",ss);
p = strtok(NULL,d);
}
return 0;
}
这个可以实现
ttkk_2007 2008-06-23
  • 打赏
  • 举报
回复

char str[] = " ¦200 ¦5000 ¦2 ¦88 ¦345 ¦" ;
char delims[] = "|";
char *result = NULL;
result = strtok( str, delims );
int nums[100];
int i = 0;
while( result != NULL ) {
nums[i++] = atoi(result);
result = strtok( NULL, delims );
}

xjb922 2008-06-23
  • 打赏
  • 举报
回复
char *strtok(char *str1, const char *str2);
功能:把 str1 指向的字符串分割成一些子串。具体操作方式如下:
1. 如果 str1 指向的字符串中的每一个字符都在 str2 指向的字符串中出现,则返回一个 NULL;
2. 在 str1 指向的字符串中从左到右寻找第一个字符,这个字符不在 str2 指向的字符串中出现过,如果找到,就标记为第一个子串的开始处,然后继续往后比较,并以此规则不断往后扩展,直到找到一个字符,它在 str2 指向的字符串中出现过,这时就用一个 '\0' 来替换这个字符,这样就结束了一个字符子串。然后这个字符的后一个字符位置会被(暗中)记录下来,供后面使用。
3. 字符串结尾的 '\0' 应看作是字符串的一部分;
4. 如果 str1 指向的字符串中的每一个字符都不在 str2 指向的字符串中,则返回 str1;
5. 返回第一个字符子串的起始地址指针;
6. 在接下来的调用中,我们要让 str1 指向 NULL,这会让上次调用 strtok 时被保存的那个位置指针被重新拾起,并从那个点开始寻找下一个子串。在后面的调用时, str2 可以换作指向不同的字符串。

char *strtok(char *p, const char *tok)
{
static char *t;
char *r;
int n;

if (p)
t = p;

r = t + strspn (t, tok);
if (!(n = strcspn (r, tok)))
return (0);
t = r + n;
if (*t)
*t++ = 0;
return (r);
}
Example:

#include<string.h>
#include<stdio.h>

int main(void)
{
char search_string[]="Woody Norm Cliff";
char *array[50];
int loop;

array[0]=strtok(search_string," ");
if(array[0]==NULL)
{
printf("No test to search.\n");
exit(0);
}

for(loop=1;loop<50;loop++)
{
array[loop]=strtok(NULL," ");
if(array[loop]==NULL)
break;
}

for(loop=0;loop<50;loop++)
{
if(array[loop]==NULL)
break;
printf("Item #%d is %s.\n",loop,array[loop]);
}

return 0;
}

This program replaces each space into a null character and stores a pointer to each substring into the array. It then prints out each item.

评点:
1. 这个函数设计得太绝啦!关键就在于这一句 static char *t 中的 static,用一个局部静态变量来保存上次调用的一个中间信息。一次 strtok 只搜寻一个子串,所以要完全分割一个长串,要多次调用 strtok。看懂给出的那个例子,仿照着写就可以了。
2. 这种方式设计得很通用,功能很强,但有点难懂。
3. str2 指向的字符串一般为分隔符的集合。
yuzl32 2008-06-23
  • 打赏
  • 举报
回复

strtok
xjb922 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 willa815 的回复:]
函数名: strtok
功 能: 查找由在第二个串中指定的分界符分隔开的单词
用 法: char *strtok(char *str1, char *str2);
例如,"324,jkfg,kdlfjg,9435,fhgf"
得到的结果为 324
jkfg
kdlfjg
9435
fhgf
搂主是想写这样的一个函数,大家好像没有明白他的意思
[/Quote]

对 就是 这个意思 ! UP 大家思考下!
xjb922 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jillnicky 的回复:]
引用 7 楼 xjb922 的回复:
关键是 “ ¦2 ¦4 ¦55 ¦887 ¦665 ¦55 ¦667 ¦”是动态的
不能搞死!

是说个数是动态的?那就得写程序了!~
看4楼的代码……
如果只是固定就4个数或者几个数的话,可以用

C/C++ codesscanf(p,"%d ¦%d ¦%d ¦%d ¦",&a[0],&a[1],&a[2],&a[3]);
[/Quote]

变化的就不能用了 应该先求 长度!然后再循环 把‘2’,‘0’,‘0’ 组成一个小窜 然后再传入一个数组保存!
willa815 2008-06-23
  • 打赏
  • 举报
回复
函数名: strtok
功 能: 查找由在第二个串中指定的分界符分隔开的单词
用 法: char *strtok(char *str1, char *str2);
例如,"324,jkfg,kdlfjg,9435,fhgf"
得到的结果为 324
jkfg
kdlfjg
9435
fhgf
搂主是想写这样的一个函数,大家好像没有明白他的意思
xjb922 2008-06-23
  • 打赏
  • 举报
回复
C 语言 :
把字符串 char *p="¦200¦5000¦2¦88¦345¦" 动态长度。
怎么以数组元素的形式装入:int a[]={200,5000,2,88,345}
*p 是以每字节存储 上面的串占19个字节
怎么把‘2’ ‘0’ ‘0’ 这3个字节变成 int a[]={200) 类似的格式转数组存储
非数组A[]={'2','0','0'}这样
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xjb922 的回复:]
关键是 “ ¦2 ¦4 ¦55 ¦887 ¦665 ¦55 ¦667 ¦”是动态的
不能搞死!
[/Quote]
是说个数是动态的?那就得写程序了!~
看4楼的代码……
如果只是固定就4个数或者几个数的话,可以用
sscanf(p,"%d ¦%d ¦%d ¦%d ¦",&a[0],&a[1],&a[2],&a[3]);

hai040 2008-06-23
  • 打赏
  • 举报
回复

stringstream ss("¦200 ¦5000 ¦2 ¦88 ¦345 ¦")
char c;
for (int i = 0; i < 5; ++i)
ss>>c>>a[i];
aozhi 2008-06-23
  • 打赏
  • 举报
回复

sscanf(p,"|%d|%d|%d|%d|%d|",&a[0],&a[1],&a[2],&a[3],&a[4]);
加载更多回复(11)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧