c语言中字符串分割问题,在线急等。。。。 C语言分割字符串
C\u8bed\u8a00\u5b57\u7b26\u4e32\u64cd\u4f5c\u95ee\u9898 \u5728\u7ebf\u7b49/*\u4eb2\u6709\u4efb\u4f55\u95ee\u9898\u8bf7\u95ee\u6211\uff0c\u671b\u91c7\u7eb3\u3002\u6709\u4ec0\u4e48\u6539\u8fdb\u7684\u5730\u65b9\u76f4\u63a5\u8bf4\uff0c\u56e0\u4e3a\u521a\u53bb\u5403\u996d\u4e86\uff0c\u6ca1\u6709\u53ca\u65f6\u56de\u7b54*/
#include
//#include//(\u975evs\u7f16\u8bd1\u5668\u4e0d\u8981\u6b64\u53e5)
#include
void separateString(const char * str){
int i = 0;
while(i < strlen(str)){
while ('A' <= str[i] && str[i] <= 'Z'){
printf("%c", 'a' + (str[i] - 'A'));
i++;
}
printf(" ");
while ('a' <= str[i] && str[i] <= 'z'){
printf("%c", str[i]);
i++;
}
printf(" ");
if (i >= strlen(str))
break;
}
printf("\n");
}
int main(){
char str[20] = "HELLOmyDEARworld";
separateString(str);
//system("pause");//(\u975evs\u7f16\u8bd1\u5668\u4e0d\u8981\u6b64\u53e5)
return 0;
}
\u4f7f\u7528strtok\u51fd\u6570\u5373\u53ef\u5b9e\u73b0\u5206\u5272\u5b57\u7b26\u4e32\u3002
1\u3001strtok\u51fd\u6570\uff1a\u539f\u578b\uff1achar *strtok(char s[], const char *delim)\uff1b\u529f\u80fd\uff1a\u5c06\u4e00\u4e2a\u5b57\u7b26\u4e32\u5206\u89e3\u4e3a\u4e00\u7ec4\u5b57\u7b26\u4e32\uff0cs\u4e3a\u8981\u5206\u89e3\u7684\u5b57\u7b26\u4e32\uff0cdelim\u4e3a\u5206\u9694\u7b26\u5b57\u7b26\u4e32\uff1b\u8bf4\u660e\uff1a\u5f53strtok\u51fd\u6570\u5728\u53c2\u6570s\u7684\u5b57\u7b26\u4e32\u4e2d\u53d1\u73b0\u53c2\u6570delim\u4e2d\u5305\u542b\u7684\u5206\u5272\u5b57\u7b26\u65f6,\u5219\u4f1a\u5c06\u8be5\u5b57\u7b26\u6539\u4e3a\0 \u5b57\u7b26\u3002\u5728\u7b2c\u4e00\u6b21\u8c03\u7528\u65f6\uff0cstrtok()\u5fc5\u9700\u7ed9\u4e88\u53c2\u6570s\u5b57\u7b26\u4e32\uff0c\u5f80\u540e\u7684\u8c03\u7528\u5219\u5c06\u53c2\u6570s\u8bbe\u7f6e\u6210NULL\u3002\u6bcf\u6b21\u8c03\u7528\u6210\u529f\u5219\u8fd4\u56de\u6307\u5411\u88ab\u5206\u5272\u51fa\u7247\u6bb5\u7684\u6307\u9488\uff1b\u5934\u6587\u4ef6\uff1astring.h\uff1b\u8fd4\u56de\u503c\uff1a\u4ece\u5b57\u7b26\u4e32s\u5f00\u5934\u5f00\u59cb\u7684\u4e00\u4e2a\u4e2a\u88ab\u5206\u5272\u7684\u5b57\u7b26\u4e32\u3002\u5206\u5272\u7ed3\u675f\u65f6\uff0c\u8fd4\u56deNULL\u3002\u6240\u6709delim\u4e2d\u5305\u542b\u7684\u5b57\u7b26\u90fd\u4f1a\u88ab\u6ee4\u6389\uff0c\u5e76\u5c06\u88ab\u6ee4\u6389\u7684\u5730\u65b9\u8bbe\u4e3a\u4e00\u5904\u5206\u5272\u7684\u8282\u70b9\u30022\u3001\u4f8b\u7a0b\uff1a
#include#includeint main(){ char input[16]="abc,d,ef,g";//\u5f85\u5206\u89e3\u5b57\u7b26\u4e32 char* delim=",";//\u5206\u9694\u7b26\u5b57\u7b26\u4e32 char* p=strtok(input,delim);//\u7b2c\u4e00\u6b21\u8c03\u7528strtok while(p!=NULL){//\u5f53\u8fd4\u56de\u503c\u4e0d\u4e3aNULL\u65f6\uff0c\u7ee7\u7eed\u5faa\u73af printf("%s\n",p);//\u8f93\u51fa\u5206\u89e3\u7684\u5b57\u7b26\u4e32 p=strtok(NULL,delim);//\u7ee7\u7eed\u8c03\u7528strtok\uff0c\u5206\u89e3\u5269\u4e0b\u7684\u5b57\u7b26\u4e32 } return 0;}
要达到这样的效果,用sscanf看来是搞不定了,只能自己写函数。
下面的函数看是否满足需求,你可以在全局变量str[]里加任意多的路径,但有一点注意的是,字符\在串里必须转义为\\,路径长度不超过128位即可。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char str[] = "clamscan c:\\Documents and Settings d:\est 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:
");
for (j = 0; j < i; j++)
{
printf("[%s]
", *(pStr+j));
}
free(pStr);
}
输出效果:
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内字符的字符数。
你应该学学命令行解释器的做法.
如果一个参数内包含空格, 必须用""包含起来.
#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;
}
"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"
这样才不引起歧义
可以判断一个新字符串的第2个字母(如果存在第二个字母)是不是':'
如果是,那就是一个新的路径,如果不是 就strcat到前一个字符串上
不过不推荐这么做,本来一个控制台程序传参数就不应该直接写带空格的路径名,至少应该用双引号引起来。
不可能分得了。除非加多一些标示符号。
因为如果是"c:\Documents and Settings clamscan d:\test",那该怎样分?或者楼主再说清楚点。
绛旓細瑕佽揪鍒拌繖鏍风殑鏁堟灉锛岀敤sscanf鐪嬫潵鏄悶涓嶅畾浜嗭紝鍙兘鑷繁鍐欏嚱鏁般備笅闈㈢殑鍑芥暟鐪嬫槸鍚︽弧瓒抽渶姹傦紝浣犲彲浠ュ湪鍏ㄥ眬鍙橀噺str[]閲屽姞浠绘剰澶氱殑璺緞锛屼絾鏈変竴鐐规敞鎰忕殑鏄紝瀛楃\鍦涓查噷蹇呴』杞箟涓篭\锛岃矾寰勯暱搴︿笉瓒呰繃128浣嶅嵆鍙俰nclude <stdio.h> include <string.h> include <stdlib.h> char str[] = "clamscan c:\...
绛旓細int main(void){ char str[1000];//瀹氫箟涓涓瀛楃涓鏁扮粍 char strnew[1000];//瀹氫箟涓涓鐢ㄥ瓧绗︿覆鏁扮粍 char m[] = " ";//瀹氫箟绌烘牸鍙橀噺 printf("璇疯緭鍏ヤ竴涓插瓧绗锛");//鏂囧瓧鎻愮ず杈撳叆瀛楃涓 gets(str);//杈撳叆瀛楃涓 char *p = strtok(str,m);//鍙杝tr涓巑鐨勬寚閽 printf("%s\n",p); ...
绛旓細include<stdio.h>#include<string.h>int main(void){char a[1000];char aa[1000];char c[] = " ";printf("璇疯緭鍏ヤ竴涓插瓧绗锛");gets(a);char *p = strtok(a,c);printf("%s\n",p);p = strtok(NULL,c);while(p){printf("%s\n",p);p = strtok(NULL,c); }} ...
绛旓細c璇█涓娌℃湁 string class, 鍋囧畾浣犳寚 char 瀛楃涓銆傜敤 sscanf 鏂规硶鍙互鍒嗗壊銆俢har str2[]="aa 123,bb 456,cc 789,dd 000";鎸閫楀彿鍒嗗壊涓4 閮ㄥ垎锛歛a 123 bb 456 cc 789 dd 000 --- char str[]="aa,bb,cc,dd";鎸夐楀彿鍒嗗壊涓4 閮ㄥ垎锛歛a bb cc dd --- include <stdio.h> main(){...
绛旓細缁勬垚瀛楃涓茬殑鍔炴硶寰堢畝鍗曪細char buf[100];sprintf(buf, "%d,%d,%d,%d,%d", a, b, c, d, e);杩欐牱buf鏁扮粍涓氨瀛樺緱鏄"10,20,30,40,50"杩欎釜瀛楃涓蹭簡銆傛兂鍒嗗紑鐨勮瘽锛屽畾涔変竴涓寚閽坧锛岃杩欎釜鎸囬拡浠巄uf[0] 寮濮嬫寚锛岃p ++锛屾瘡娆$洿鍒閫楀彿鐨鏃跺欏氨璺冲嚭锛屽鏋滀笉鏄楀彿鐨勮瘽锛屽氨灏嗗綋鍓嶆寚閽堟寚鍚戠殑...
绛旓細鍙互鐢╯trtok鍑芥暟锛屾寜鏍囧織鎶瀛楃涓鍒嗗紑 include <string.h> include <stdio.h> char string[] = "A string\tof,tokens\nand some more tokens";char seps[] = " ,\t\n"; //鎷嗗垎鐨鏍囧織涓 绌烘牸锛岄楀彿,\t,\n char *token;void main( void ){ printf( "%s\n\nTokens:\n", ...
绛旓細C/C++涓殑Split鍑芥暟鏄痵trtok()鍏跺嚱鏁板師鍨嬪涓:char * strtok (char * str, const char * delimiters);鍑芥暟璇存槑 strtok()鐢ㄦ潵灏瀛楃涓插垎鍓鎴愪竴涓釜鐗囨銆傚弬鏁皊tr鎸囧悜娆插垎鍓鐨勫瓧绗︿覆锛鍙傛暟delimiters鍒欎负鍒嗗壊瀛楃涓诧紝褰搒trtok()鍦ㄥ弬鏁皊tr鐨勫瓧绗︿覆涓彂鐜板埌鍙傛暟delimiters鐨勫垎鍓插瓧绗︽椂鍒欎細灏嗚瀛楃鏀逛负'\0...
绛旓細include <string.h> int main(){ int i;char a[40] = "aaaaaaaabbbbbbbccccccdddddd";char b[5] = "cccc";char *p = strstr(a, b);for ( i= 0; &a[i]!=p;i++ ){ printf("%c", a[i]);} printf("\n");i += strlen(b);for (;a[i] != '\0'; i++){ pri...
绛旓細1銆乻trtok鍑芥暟锛氬師鍨嬶細char *strtok(char s[], const char *delim)锛涘姛鑳斤細灏嗕竴涓瓧绗︿覆鍒嗚В涓轰竴缁勫瓧绗︿覆锛宻涓鸿鍒嗚В鐨勫瓧绗︿覆锛delim涓哄垎闅旂瀛楃涓诧紱璇存槑锛氬綋strtok鍑芥暟鍦ㄥ弬鏁皊鐨勫瓧绗︿覆涓彂鐜板弬鏁癲elim涓寘鍚殑鍒嗗壊瀛楃鏃,鍒欎細灏嗚瀛楃鏀逛负\0 瀛楃銆傚湪绗竴娆¤皟鐢ㄦ椂锛宻trtok()蹇呴渶缁欎簣鍙傛暟s瀛楃涓...
绛旓細鍙互鍐欎竴涓鍒嗗壊鍑芥暟锛岀敤浜庡垎鍓叉寚浠わ紝姣斿cat a.c鏈鍚庝細琚垎鍓叉垚cat鍜宎.c涓や釜瀛楃涓銆乵v a.c b.c鏈鍚庝細琚垎鍓叉垚mv鍜宎.c鍜宐.c涓変釜瀛楃涓层傚弬鑰冧唬鐮佸涓嬶細include <stdio.h>#include<string.h>#define MAX_LEN 128void main(){ int i,length,ct=0,start = -1; char inputBuffer[MA...