用倒数第二个字符交换第二个字符

时间:2015-11-21 09:21:24

标签: c string

我必须用倒数第二个字母改变第二个字母,并且超过3个字母。 示例我有这个字符串:亚历克斯仅仅是 结果应该是:Aelx是mree
但是当我运行我的程序时,我得到了这个:Axel` aler

这是代码:

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

int main()
{
    int i,n,j=0;
    char text[81],cuv[44],l;

    printf("Introduce-ti textul:");
    gets(text);

    for(i=0;i<strlen(text);i++)
    {
        if(text[i] != 32) {
            cuv[j]=text[i];
            j += 1;
        } else {
            n = strlen(cuv) - 1;

            l= cuv[1];
            cuv[1]=cuv[n-1];
            cuv[n-1]=l;

            printf("%s ",cuv);
            strcpy(cuv,"");
            j=0;
        }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:0)

首先,您不想使用gets。它已从标准库中删除,因为它不安全,请改用fgets。话虽这么说,你需要做的就是将你的输入字符串标记为单词,然后如果单词大于3个字符,则交换第二个和最后一个字符。一种方法是:

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

#define MAXS 256
#define MAXW  64

int main (void) {

    size_t len;
    char str[MAXS] = {0};
    char word[MAXW] = {0};
    char *p = NULL;

    fgets (str, MAXS, stdin);   /* read input from stdin */

    /* tokenize string */
    for (p = strtok (str, " "); p; p = strtok (NULL, " \n")) 
    {
        strncpy (word, p, MAXW - 1);    /* copy token to word */

        if ((len = strlen (word)) > 3)  /* if word > 3 */
        {
            char tmp = word[1];         /* swap 2nd & next to last */
            word[1] = word[len-2];
            word[len-2] = tmp;
        }
        printf ("%s ", word);        
    }
    putchar ('\n');

    return 0;
}

使用/输出

$ printf "Alex are mere\n" | ./bin/swap2nd
Aelx are mree

或者如果您想输入文字:

$ ./bin/swap2nd
Alex are mere
Aelx are mree

使用开始/结束指针的第二种方法

您还可以使用开始指针(下面的fgets)和结束指针来修改原始字符串就绪p(下面的ep)按字符逐个字符逐行,每次结束指针指向space,{{ 1}}或tab然后使用 start end 指针之间的差异来检查单词的长度并执行字符交换(如果长度)大于3个字符。您可以浏览每个版本并进行比较:

newline

使用/输出

#include <stdio.h>

#define MAXS 256

int main (void) {

    char str[MAXS] = {0};
    char *p = NULL;
    char *ep = NULL;

    fgets (str, MAXS, stdin);   /* read input from stdin */

    p = ep = str;

    while (*ep) /* for each char, if a space, tab or newline */
        if (*ep == ' ' || *ep == '\t' || *ep == '\n') {
            if ((ep - p) > 3) {         /* if length > 3 */
                char tmp = *(p + 1);    /* swap chars    */
                *(p + 1) = *(ep - 2);
                *(ep - 2) = tmp;
            }
            p = ++ep;   /* set p to next word */
        }
        else
            ++ep;

    printf ("%s\n", str);

    return 0;
}

您在这两种方法之间选择哪种方法,以及Vlad发布的方法,主要是品味/选择。一切都是有效的,只是完成同样事情的不同方式。如果您有疑问,请告诉我。

答案 1 :(得分:0)

尝试以下方法

#include <stdio.h>

int main( void )
{
    char s[] = "Alex Chiurtu";
    char t[sizeof( s )];

    size_t i = 0, j = 0;

    do
    {
        t[i] = s[i];
        if ( s[i] != ' ' && s[i] != '\t' && s[i] != '\0' )
        {
            ++j;
        }
        else if ( j != 0 )
        {            
            if ( j > 3 )
            {                
                char c = t[i-j + 1];
                t[i-j+1] = t[i-2];
                t[i-2] = c;
            }

            j = 0;
        }
    } while ( s[i++] );        


    puts( s );
    puts( t );

    return 0;
}

程序输出

Alex Chiurtu
Aelx Ctiurhu

考虑到函数gets不安全,不再受C标准支持。

使用像32这样的幻数也是一个坏主意。其含义尚不清楚。

在程序数组中cuv未初始化为零,因此以下语句

n = strlen(cuv) - 1;

导致程序的未定义行为。每次计算字符串的长度也不是一个好主意。