c语言中字符串分割问题,在线急等。。。。

现有字符串"clamscan c:\Documents and Settings d:\test",要把它分成
串1:"clamscan" 串2"c:\Documents and Settings" 串3"d:\test"
当然,是不能数字符串个数截取的,因为c:\Documents and Settings或d:\test是任意的路径。
现在我已经写好了一个函数,能按空格分割,可是那样的话c:\Documents and Settings 就分成了c:\Documents 和and 和 Settings三部分,求各位仗义大侠相救。。。

谢谢Helicopter的关注,情况是这样的
c:\Documents and Settings clamscan d:\test 这种情况是不会存在的,现在主要是解决后边路径的分割问题,当然后边的路径不一定是两个,可以没有,也可以是多个

要达到这样的效果,用sscanf看来是搞不定了,只能自己写函数。

下面的函数看是否满足需求,你可以在全局变量str[]里加任意多的路径,但有一点注意的是,字符\在串里必须转义为\\,路径长度不超过128位即可。

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

char str[] = "clamscan c:\\Documents and Settings d:\\test e:\\a and b f:\\c and d";

void main()

{

 int i = 0, j = 0;

 char (*pStr)[128] = NULL;

 char *s = str;

 char *ss = NULL;

 while (1)

 {

  pStr = (char (*)[128])realloc(pStr, (i+1)*(128));

  memset(*(pStr+i), 0, 128);

  ss = strchr(s, ':');

  if (i == 0)

  {

   if (ss == NULL)

   {

    strcpy(*(pStr+i), s);

    i++;

    break;

   }

   memcpy(*(pStr+i), s, ss-s-2);

   s = ss+1;

   i++;

   continue;

  }

  if (ss == NULL)

  {

   strcpy(*(pStr+i), s-2);

   i++;

   break;

  }

  memcpy(*(pStr+i), s-2, ss-s);

  s = ss+1;

  i++;

 }

 printf("After despare, the strings are:\n");

 for (j = 0; j < i; j++)

 {

  printf("[%s]\n", *(pStr+j));

 }

 

 free(pStr);

}

输出效果:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-08-31
void main()
{
char *str1="c:\\asd qwe zxc",*str2=" ";
int x;
while (x=strcspn( str1, str2 ))
{
for (int i=0;i<x;i++)
{
printf("%c",*(str1+i));
}
printf("\n");
str1=strchr(str1,' ')+1;
if(strchr(str1,' ')==NULL)
{
printf("%s\n",str1);
break;
}
}
}
#include <string.h>
char *strrchr( const char *str, int ch );
功能:函数返回一个指针,它指向字符ch 在字符串str末次出现的位置,如果匹配失败,返回NULL。

size_t strcspn( const char *str1, const char *str2 );
功能:函数返回str1 开头连续n个字符都不含字符串str2内字符的字符数。
第2个回答  2009-08-31
你应该学学命令行解释器的做法.

如果一个参数内包含空格, 必须用""包含起来.

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

// 消"
char * kill_quote(char *s)
{
if(*s=='\"')
{
*(s+strlen(s)-1)=0;
s++;
}
return s;
}
// 会修改s的内容
int parse_command(char *s,char ***pszArr)
{
char *p=s;
int nParamCount=0;
int Quote = 0;
while(*p)
{
if(*p=='\"')
{
Quote++;
}
if(!Quote) // 如果没遇到"
{
if(*p==' ') // 遇到空格,结束
{
*p=0;
nParamCount++;
}
}
else
{
if(Quote==2)
Quote=0;
}
p++;
}
if(*(p-1)!=' ') nParamCount++;
if(pszArr)
{
*pszArr = (char**)malloc(sizeof(char*)*nParamCount);
char **szArr = *pszArr;
int i=1;
szArr[0]=s;
for(;i<nParamCount;i++)
{
szArr[i]=szArr[i-1]+strlen(szArr[i-1])+1;
szArr[i-1] = kill_quote(szArr[i-1]);
}
szArr[i-1] = kill_quote(szArr[i-1]);
}
return nParamCount;
}

int main()
{
char s[]="clamscan \"c:\\Documents and Settings\" d:\\test";
char **szArr;
int n,i;
printf("%d\n",n=parse_command(s,&szArr));
for(i=0;i<n;i++) printf("%s\n",szArr[i]);

free(szArr);
getchar();
return 0;
}
第3个回答  2009-08-31
"clamscan c:\Documents and Settings d:\test"
这样明显不能以空格分割的

很简单的解决方案,把空格改成其他分割符号,例如
"clamscan$c:\Documents and Settings$d:\test"
这样按$分,不是很简单么

windows系统要求把c:\Documents and Settings这样的参数加引号的
例如CMD命令里
cd "c:\Documents and Settings"
这样才不引起歧义
第4个回答  2009-08-31
可以判断一个新字符串的第2个字母(如果存在第二个字母)是不是':'
如果是,那就是一个新的路径,如果不是 就strcat到前一个字符串上

不过不推荐这么做,本来一个控制台程序传参数就不应该直接写带空格的路径名,至少应该用双引号引起来。
第5个回答  2009-08-31
不可能分得了。除非加多一些标示符号。
因为如果是"c:\Documents and Settings clamscan d:\test",那该怎样分?或者楼主再说清楚点。
相似回答