【问题标题】:C - how to rearrange a stringC - 如何重新排列字符串
【发布时间】:2014-05-29 12:46:18
【问题描述】:

我有一个命令行参数,它是字母数字,例如“ABCDE1234567”作为 argv[1] 传递。我正在寻找重新排列 char* 以便将前 4 个字符发送到字符串的末尾,所以它最终会像 E1234567ABCD 一样。

我从 argv 获取 char*,如下所示:

char* input = argv[1];
validate(input);

然后传递给一个函数来完成工作,

void validate (char* input) {
    // move the first 4 chars to the end
    // this is where i'm stuck :-)
}

我知道这应该很容易,但我一直在尝试使用 strcpy、sprintf、for 循环,但没有成功。

编辑:

我试图将没有前四个字符的字符串复制到缓冲区中,但这似乎没有产生任何结果:

int n = strlen(input);
char buffer [n - 4];

for (int i = 4; i <= n; i++) {
    printf("%c\n", input[i]);
    sprintf(buffer, "%c", input[i]);
}
printf("%s\n", buffer);

【问题讨论】:

  • 请在您的问题中包含有问题的代码。
  • 你自己尝试了什么?

标签: c


【解决方案1】:

字符串函数的组合可能是最简单的选择:

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

void validate (char* input) {
    // Temp storage for four characters being moved.

    char four[4];

    // Get length but do nothing unless long enough.

    size_t len = strlen (input);
    if (len < 5)
        return;

    // Save first four characters.

    memcpy (four, input, 4);

    // Move the others (need memmove for overlapping regions).
    // input is address of first character.
    // &(input[n-1]) is address of nth character.

    memmove (input, &(input[4]), len - 4);

    // Put saved four characters at the end.
    // &(input[len - n]) is address of nth-last character.

    memcpy (&(input[len - 4]), four, 4);
}

// A simple test program for checking.

int main (int argc, char *argv[]) {
    if (argc < 2) {
        printf ("Not enough arguments\n");
        return 1;
    }
    printf ("Converted '%s' ", argv[1]);
    validate (argv[1]);
    printf ("to '%s'\n", argv[1]);
    return 0;
}

【讨论】:

    【解决方案2】:

    考虑另一种方法:如果将两个字符串连接在一起会发生什么:

    ABCDE1234567 ABCDE1234567
    

    ...然后将“滑动窗口”向前移动几个字符:

    ABCD E1234567ABCD E1234567
    

    您可以通过指向正确位置的指针轻松实现此目的,并将所需的数据复制到目的地。

    请注意,字符串是一个字符数组,后跟一个空字符 \0。字符串不是只是一个字符数组。

    【讨论】:

    • 感谢 lorenzog,您认为使用 char 数组还是 char* 进行这种操作更好?
    • 你不能动态分配一个数组——也就是说,如果你分配了 512 个字节但字符串是 513 个字节长会发生什么?还是4096? (提示:阅读“缓冲区溢出”)。因此,你需要先抓取字符串,确定它的长度,用malloc()分配一个合适的内存区域,把字符串复制进去,然后你就可以开始玩指针了。 C 很有趣 :)
    • 自从我涉足c以来已经有一段时间了,我已经有一段时间了,所以很高兴回到指针的乐趣。谢谢你的信息。
    【解决方案3】:

    下面的代码可能会有所帮助。

    void validate (char* input) {
            char temp[10];
            strncpy ( temp, input, 4 ); //copy first 4 chars to temp
            temp = '\0'; //terminate it.
    
            //Copy characters from 5th to end
            for(i=0;i<strlen(input)-4;i++)
             {
               input[i] = input[i+4];
             }
             //copy remaining four characters from temp at last
             for(i=strlen(input)-4,j=0;i<strlen(input);i++)
             {
               input[i]=temp[j];
               j++;
             }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2011-04-15
      • 2020-12-28
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多