函数内部字符串的操作



我在这方面已经有一段时间了。

让用户声明一个字符串数组:

#define LENGTH 3
int main()
{
char* hohoho[3]={"string1","string2","string3"};
foo1(hohoho);
for(i=0; i<LENGTH-1; i++)
{
printf("%s, ",hohoho[i]);
}
printf("%s.",hohoho[LENGTH-1]);
return 0;
}
foo1(char** array);
{
/*moving array 1 time left and placing first one at the end*/
}

预期:string2, string3, string1.

我尝试过用tmp*char来更改字符串,我试过通过地址更改它们,在网上找不到关于如何进行此练习的信息。据我所知,我不能改变字符串本身,因为它们被认为是只读字符串。在这方面,我不能使用malloc或任何帮助数组。

array是指向数组的指针,其中包含指向字符串的指针,因此您可以从函数更改数组中的指针。

从这一点上讲,这只是一个如何按照你想要的方式打乱指针的问题。这基本上是交换两个变量的较长版本,如:

tmp_s = s1;
s1 = s2;
s2 = tmp_s;

如果这些在一个数组中,它看起来像:

tmp_s = s[0];
s[0] = s[1];
s[1] = tmp_s;

由于您有一个由多个值组成的数组,因此中间部分(s[i] = s[i+1](需要一个循环。这里的复杂之处在于,您需要知道数组的长度。通常,这将是传递给foo1()函数的另一个值,或者数组将具有一个占位符值,指示值的末尾(例如a = {"a", "b", "c", NULL}(。

如果不允许更改数组声明或函数参数,您只需要假设数组长度是一个常量——看起来length被定义为3,这样您就可以使用它。

虽然我不理解你的"moving array 1 time left"注释,但我认为这意味着将所有元素向左旋转1,这样你就得到了"string2", "string3", "string1",然后交换第一个/最后一个元素就会得到"string1", "string3", "string2"(最终结果是有效地交换了第二个和第三个元素(

如前所述,您有一个指向字符串文本的指针数组,因此字符串的内容是不可变的,但您可以交换指针的顺序。如果你采用上面的逻辑,并首先/最后应用左旋转和交换,你的foo1()函数可能是:

void foo1 (char **array)
{
/*moving array 1 time left and placing first one at the end*/
char *tmp = array[0];

for (int i = 1; i < LENGTH; i++)    /* move all elements left by 1 */
array[i-1] = array[i];
array[LENGTH-1] = tmp;

tmp = array[0];                     /* swap 1st and last */
array[0] = array[LENGTH-1];
array[LENGTH-1] = tmp;
}

(注意:如果你不需要元素的左旋转,你可以删除代码的那部分(

如果你添加了所需的标题,完整的代码可以写成:

#include <stdio.h>
#define LENGTH 3
void foo1 (char **array)
{
/*moving array 1 time left and placing first one at the end*/
char *tmp = array[0];

for (int i = 1; i < LENGTH; i++)    /* move all elements left by 1 */
array[i-1] = array[i];
array[LENGTH-1] = tmp;

tmp = array[0];                     /* swap 1st and last */
array[0] = array[LENGTH-1];
array[LENGTH-1] = tmp;
}
int main (void) {
char *hohoho[] = {"string1", "string2", "string3"};

puts ("original order:");
for (int i=0; i<LENGTH; i++)
puts (hohoho[i]);

foo1 (hohoho);

puts("norder after rotating left 1 and swapping first/last:");
for (int i=0; i<LENGTH; i++)
puts (hohoho[i]);

printf ("n%s.n", hohoho[LENGTH-1]);
}

示例使用/输出

$ ./bin/swap_arr_of_ptrs
original order:
string1
string2
string3
order after rotating left 1 and swapping first/last:
string1
string3
string2
string2.

(不知道为什么要包含最后一个输出,但它就在那里…(

仔细检查一下,让我知道"moving array 1 time left"部分的逻辑是否错误,或者你是否有进一步的问题。

相关内容

  • 没有找到相关文章

最新更新