int main() {int n;scanf("%" />
您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> c字符串求助

c字符串求助

来源:网络整理     时间:2016/6/23 12:42:10     关键词:

关于网友提出的“ c字符串求助”问题疑问,本网通过在网上对“ c字符串求助”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: c字符串求助
描述:

c字符串

题目要求以“_"来分隔,输入n表示测试的次数,接下来的n行每行都输入一字符串,若碰到”_“就把之间的字符倒序输出
例如输入”45_df“,输出则为”54_fd",输入“_45_",输出”_54_"。我的代码为什么只能执行一次,而且以“_"开头的输出是错的? c字符串求助求助大神们
#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; //跳出循环 

}
}
}

 c字符串求助解决方案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

相关图片

相关文章