user-0 提问: c字符串求助

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <stdbool.h>  static const char _blank[] = " \t\n";  static inline bool  is_blank(char c) { 	int i; 	for(i = 0; i < (sizeof(_blank) - 1); ++i) 	{ 		if(c == _blank[i]) return true; 	} 	return false; }  static inline char * trim_left(char * begin, char * end) {	 	while(begin < end) 	{ 		if(!is_blank(*begin)) break; 		++begin;	 	} 	return begin; }  static inline char * trim_right(char * begin, char * end) {	 	if(begin == end) return end; 	 	while(end > begin) 	{ 		--end; 		if(!is_blank(*end)) break; 	} 	*(end + 1) = '\0'; 	return end + 1; }  static inline void swap_bytes(char * begin, char * end) { 	char c; 	while(begin < end) { 		c = *begin; 		*begin++ = *(--end); 		*end = c; 	} }    int main(int argc, char **argv) { #define MAX_LINE (100) 	int c, i; 	int n = -1; 	 	printf("n = "); 	while(1) 	{		 		c = scanf("%d", &n); 		if(c == 0)  		{ 			while((c = getchar()) != '\n' && c != EOF); // skip tailing charactors 			printf("invalid value. please reinput: \nn = "); 			continue; 		} 		break; 	} 	while((c = getchar()) != '\n' && c != EOF);  	if(-1 == n) exit(1); 	 	char (* input)[MAX_LINE]; // 声明一个二维数组的行指针(每行最多允许输入MAX_LINE个char） 	// 动态分配二维数组的内存 	input = (char (*)[MAX_LINE])malloc(sizeof(char [MAX_LINE]) * n);  	assert(NULL != input); 	 	for(i = 0; i < n; ++i) 	{ 		printf("%d:\t", i + 1); 		fgets(input[i], MAX_LINE, stdin); 	} 	 	char * p, * p_end; 	char * p_sep; 	char * begin; 	for(i = 0; i < n; ++i) 	{ 		p = input[i]; 		p_end = p + strlen(input[i]); 			 		p = trim_left(p, p_end); 		p_end = trim_right(p, p_end); 		printf("str_%d = [%s]  ==> ", i + 1, p); 		 		if(p == p_end) // no content 		{ 			printf("\n"); 			continue; 		} 				 		begin = p; 		while(1) 		{ 			p_sep = strchr(p, '_'); 			if(p_sep)  			{ 				swap_bytes(p, p_sep); 				p = p_sep + 1; 				continue; 			} 			swap_bytes(p, p_end); 			break; 		} 		printf("[%s]\n", begin); 	} 	 	free(input); 	 #undef MAX_LINE 	 	return 0; }

user: user-0
content: 我知道错误了，求大神们教我 就是输入的末尾如果有多个空格的话，输出就会错误 求助该如何删除输入完字符串之后多出来的空格 比如说输入12_12      的话，就会输出21_     21

user: user-0
content: 这个不是同一道题吧

user: user-2
content: 仅供参考：//有字符串 //1_22_333,,4444__55555,_666666 //需要解析为 //1 //22 //333 //_ //4444 //55555 //666666 #include <stdio.h> char s[]="1_22_333,,4444__55555,_666666"; char c,*p,*p1; int st; void main() {     st=0;     p=s;     while (1) {         c=*p;         if (0==c) {             switch (st) {             case 1:printf("_\n");    break;             case 2:printf("%s\n",p1);break;             }             break;//         }         switch (st) {         case 0:                  if ('_'==c) {                            st=0;}             else if (','==c) {                            st=1;}             else             {p1=p;                       st=2;}         break;         case 1:                  if ('_'==c) {                            st=1;}             else if (','==c) {printf("_\n");              st=1;}             else             {p1=p;                       st=2;}         break;         case 2:                  if ('_'==c) {*p=0;printf("%s\n",p1);*p=c;st=0;}             else if (','==c) {*p=0;printf("%s\n",p1);*p=c;st=1;}             else             {                            st=2;}         break;         }         p++;     } } //1 //22 //333 //_ //4444 //55555 //666666

user: user-0
content: 求大神们援助

user: user-0
content: 还是答案错误，明明输出时一样的，但是告诉我答案错误，不知道是哪里出错了 这是我同学用c++写的，给通过了，有什么不一样的地方吗？ #include<iostream> #include<string> #include<memory.h> using namespace std; int main() { string s[101], s1[101]; string strset = "_"; int n; cin>>n; for(int a = 0; a < n; a++){ for(int b = 0; b < 101; b++){ s[b].clear() ; s1[b].clear(); } string in; cin>>in; int first = 0, last = 0, b = 0; if(in[0] != '_'){ first = 0; last = 0; b = 0; }  else { while(in[b] == '_') b++; first = last = b; } int begin = b; while(last < in.length()) { first = last; last = in.find_first_of(strset,first + 1); if(b == begin) s[b] = in.substr(first, last-first); else s[b] = in.substr(first + 1, last - first-1); b++; } for(int c = 0; c < b; c++){ for(int d = s[c].length() - 1; d >= 0; d--){ s1[c] += s[c][d]; } } if(b != 0) cout<<s1[0]; for(int c = 1; c < b; c++){ cout<<"_"<<s1[c]; } cout<<endl; } }

user: user-3
content: 改了几个地方已经标注在里面了，楼主直接复制过去试试  #include<stdio.h> int main() { 	int n; 	scanf("%d",&n);//输入测试的次数n  	fflush(stdin);//清除换行符  	char arr[100]; 	char*p=arr; 	for(int d=0;d<n;d++) 	{ 		/*for(int e=0;e<101;e++)//初始化arr数组为0  		{ 			arr[e]=0; 		} */ 		char arr[100] = {0};//111111111111111111111 		gets(arr);//获取第d个字符串  		char*p=arr;//22222222222222222,每次循环都需要重置指针p的位置 		int ji=0;//ji表示在_之间有ji个字符  		if(*p=='_')//若第一个字符为_的话直接输出_并且将指针移到下一位  		{ 			printf("_");//3333333333333333333333 			p++; 		} 		else//若第一个字符不为_，ji+1并且将指针移到下一位  		{ 			ji++; 			p++; 		} 		while(*p!='\0')//当还没有读到该字符串的结尾时继续循环  		{ 			if(*p!='_')//若对应指针指向的字符不为_，ji+并且指针指向下一位  			{ 				ji++; 				p++; 			} 			else//若对应指针指向的字符为_，输出ji位的 *（p+i）  			{ 				int b=ji;//44444444444444444444 				for(int i=-1;b>0;b--) 				{ 					printf("%c",*(p+i)); 					i--; 				} 				printf("%c",*p);//输出_  				p++;//指针指向下一个字符  				ji=0;//将ji初始化为0  			} 			if(*p=='\0')//若读到结尾的符号  			{ 				int l=ji; 				for(int k=-1;l>0;l--)//输出ji位的*(p+k)  				{ 					printf("%c",*(p+k)); 					k--; 				} 				printf("\n");//换行  				break; //跳出循环  			}  		} 	} }

user: user-0
content: for(int d=0;d<n;d++)这一句写错了，不是2是n

user: user-0
content: 这次加上了注释，但是还是只能做一次，之后再输入第二个字符串的时候就没有输出了，为什么呢？ #include<stdio.h> int main() { 	int n; 	scanf("%d",&n);//输入测试的次数n  	fflush(stdin);//清除换行符  	char arr[100]; 	char*p=arr; 	for(int d=0;d<2;d++) 	{ 	for(int e=0;e<101;e++)//初始化arr数组为0  	{ 		arr[e]=0; 	 }  	gets(arr);//获取第d个字符串  	int ji=0;//ji表示在_之间有ji个字符  	if(*p=='_')//若第一个字符为_的话直接输出_并且将指针移到下一位  	{ 	printf("'_'"); 	p++; } 	else//若第一个字符不为_，ji+1并且将指针移到下一位  	{ 		ji++; 		p++; 	} 	while(*p!='\0')//当还没有读到该字符串的结尾时继续循环  	{ 		if(*p!='_')//若对应指针指向的字符不为_，ji+并且指针指向下一位  		{ 			ji++; 			p++; 		}         else//若对应指针指向的字符为_，输出ji位的 *（p+i）          {         	int b=ji+1;         	for(int i=-1;b>0;b--)         	{         		printf("%c",*(p+i));         		i--; 			} 			printf("%c",*p);//输出_  			p++;//指针指向下一个字符  			ji=0;//将ji初始化为0  		} 		if(*p=='\0')//若读到结尾的符号  		{ 			int l=ji; 			for(int k=-1;l>0;l--)//输出ji位的*(p+k)  			{ 				printf("%c",*(p+k)); 				k--; 			} 			printf("\n");//换行  			break; //跳出循环  		 }  	} 	} }

user: user-3
content: 楼主你的scanf("%d",&n);你输入一个数以后数字被读走了，但输入缓冲区里还遗留着\n 所以第一次进for循环的时候gets(arr);中的arr读到的是回车符，然后进行if判断，不管true还是false,p都会++ 然后第二次循环的时候，指针已经指向第二个字符了，就算输入进来的是_45_,但if(*p=='_')也会为false  解决方法： scanf("%d",&n);后面加一句  fflush(stdin);//加上这一行，就清空换行符了   PS：楼主貌似下面的逻辑还是有问题的。。楼主可以稍微想下或者加点注释再发一下