关于网友提出的“ c字符串求助”问题疑问,本网通过在网上对“ c字符串求助”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: c字符串求助
描述:c字符串
题目要求以“_"来分隔,输入n表示测试的次数,接下来的n行每行都输入一字符串,若碰到”_“就把之间的字符倒序输出
例如输入”45_df“,输出则为”54_fd",输入“_45_",输出”_54_"。我的代码为什么只能执行一次,而且以“_"开头的输出是错的?

求助大神们
#include
int main()
{
int n;
scanf("%d",&n);
char arr[100];
char*p=arr;
for(int d=0;d<2*n;d++)
{
for(int e=0;e<101;e++)
{
arr[e]=0;
}
gets(arr);
int ji=0;
if(*p=='_')
{
printf("'_'");
p++;
}
else
{
ji++;
p++;
}
while(*p!='\0')
{
if(*p!='_')
{
ji++;
p++;
}
else
{
int b=ji+1;
for(int i=-1;b>0;b--)
{
printf("%c",*(p+i));
i--;
}
printf("%c",*p);
p++;
ji=0;
}
if(*p=='\0')
{
int l=ji;
for(int k=-1;l>0;l--)
{
printf("%c",*(p+k));
k--;
}
printf("\n");
break;
}
}
}
}
解决方案1:
#include
#include
#include
#include
#include
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;
}
解决方案2: 仅供参考:
//有字符串
//1_22_333,,4444__55555,_666666
//需要解析为
//1
//22
//333
//_
//4444
//55555
//666666
#include
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
解决方案3: 改了几个地方已经标注在里面了,楼主直接复制过去试试
#include
int main()
{
int n;
scanf("%d",&n);//输入测试的次数n
fflush(stdin);//清除换行符
char arr[100];
char*p=arr;
for(int d=0;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; //跳出循环
}
}
}
}
解决方案4: 楼主你的scanf("%d",&n);你输入一个数以后数字被读走了,但输入缓冲区里还遗留着\n
所以第一次进for循环的时候gets(arr);中的arr读到的是回车符,然后进行if判断,不管true还是false,p都会++
然后第二次循环的时候,指针已经指向第二个字符了,就算输入进来的是_45_,但if(*p=='_')也会为false
解决方法:
scanf("%d",&n);后面加一句
fflush(stdin);//加上这一行,就清空换行符了
PS:楼主貌似下面的逻辑还是有问题的。。楼主可以稍微想下或者加点注释再发一下
以上介绍了“ c字符串求助”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2001982.html