交换字符串中的特定文本

Swap specific text in string

我需要编写一个函数 swapLetters 来接收两个字符串。该函数转换作为第一个参数接收的字符串,方法是将作为第二个参数传递的字符串中的第一个字符替换为同一字符串中的最后一个字符,将第二个字符替换为前一个字符,以此类推到字符串的中间。如果第二个参数包含奇数个字符,则无需对中间的字符进行任何操作。如果其中一个参数是空字符串,则该函数不需要做任何事情。

例如:

char text[9]="dobar dan", letters[5]="abcde";

输出:

After transformation text is: 'doder den'

解释:字符串letters中的第一个字符是“a”,而在字符串text中,字符“a”被替换通过字符串 letters 的最后一个字符,即“e”。字符串letters中的第二个字符是“b”,在字符串text中,字符“b”被字符串[的倒数第二个字符替换=27=]letters,也就是“d”,而字母“c”什么都没做,因为它在字符串letters的中间,还有函数停止。

该函数应该return将光标定位到文本字符串的开头以便于链式调用。

*注意:不允许使用辅助字符串

#include <stdio.h>
#include <string.h>
char *swapLetters(char *s1, char *s2) {
  int lenght1 = 0, lenght2 = 0;
  char *q1 = s1, *q2 = s2;
  while (*q1 != '[=12=]') {
    lenght1++;
    q1++;
  }
  while (*q2 != '[=12=]') {
    lenght2++;
    q2++;
  }
  return s1;
}

int main() {
  char text[9] = "dobar dan", letters[5] = "abcde";
  swapLetters(text, letters);
  printf("After transformation text is: '%s'\n", text);
  return 0;
}

你能帮我完成这个任务吗?字符串对我来说是新的。

正如其他人所指出的,您没有提供足够的 space 来让您的字符串具有 '[=12=]' 终止符。

您需要更改为:

char text[10] = "dobar dan"; 
char letters[6] = "abcde";

而且,您的函数 swapLetters 没有交换任何字符:

正确的函数应该是:

char *swapLetters(char *s1, char *s2) {
  int length2 = 0;

  char *q1 = s1, *q2 = s2;

  while (*q2 != '[=11=]') {
    length2++;
    q2++;
  }

  while (*q1 != '[=11=]') {
    // find the char in striong 'letters'
    for(int i=0; i<length2/2; i++){
        if(*q1 == s2[i]){
            *q1 = s2[length2-i-1];
        }
    }
    q1++;
  }
  
  return s1;
}

您可以使用两个 嵌套 循环来解决这个问题。外循环应该使用两个指针指向s2字符串中的字符,分别应该是checked-for和changed-to;内部循环应该(重复)运行 通过 s1 字符串,查找目标字符的出现,如果找到则更改它。

如果要更改的字符与应替换的字符之间存在任何“重叠”,您尚未指定要做什么,但是在下面的代码中,我包含了一个 'flags' 以防止在这种情况下进行多次替换。如果您想要这种行为,或者如果 s2 字符串的值根本不允许这种行为,那么您可以删除对 done数组。

我已经添加了注释来解释(我希望)代码的作用,如果您想观看,用 /// triple-slash 注释掉的两行可以是 un-commented该功能“即时”做什么。

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

char* swapLetters(char* s1, char* s2)
{
    // A quick sanity check ...
    if (!strlen(s1) || !strlen(s2)) return s1; // Zero-length strings!

    // First, let's get pointers to the first/last characters of s2...
    char* sub_beg = s2;
    char* sub_end = s2 + strlen(s2) - 1;

    size_t src_len = strlen(s1); // So we don't have to keep calling "strlen"

    // Now, we need an array to keep track of characters we've ALREADY changed...
    int* done = calloc(src_len, sizeof(int)); // calloc set all elements to ZERO
    if (!done) {
        puts("Cannot allocate workspace!");
        return s1;
    }

    // Outer loop: run until beginning and end meet or cross over...
    while (sub_beg < sub_end) {
    /// printf("Checking for %c change to %c ... \n", *sub_beg, *sub_end);
        // Inner loop: run through the source and change if found...
        for (size_t i = 0; i < src_len; ++i) {
            if (s1[i] == *sub_beg && !done[i]) {
            /// printf("Swapping %c for %c ... \n", s1[i], *sub_end);
                s1[i] = *sub_end; // Make change
                done[i] = 1;     // Flag that we've changed it
            }
        }
        ++sub_beg; // Increment beginning
        --sub_end; // Decrement end
    }
    
    // Clean-up ...
    free(done);

    return s1;
}

int main()
{
    char text[10] = "dobar dan", letters[6] = "abcde"; // NOTE: We need space for the NUL-terminator
    swapLetters(text, letters);
    printf("After transformation text is: '%s'\n", text);
    return 0;
}

另请注意,我已经增加了 textletters 数组的大小(在 main 中)以允许 需要 nul-这些字符串中的终止符。您也可以只用空方括号(即 char text[] = ...)声明这些数组,以便编译器自动分配大小。