将字符指针转换为交换函数的void指针的问题

时间:2016-02-21 01:33:26

标签: c pointers void-pointers

我正在尝试交换字符串中的字符,这是char *。我希望交换函数接受void * []是通用的,但我得到一个奇怪的行为,我不知道为什么。

我的主要人物:

int main(int argc, char *argv[])
{
    size_t n_bytes = 100;
    int bytes;
    char *my_input;
    int numeric = 0;

    my_input = (char *) malloc(n_bytes + 1);

    /* if -n option is set, sort numerically versus lexicographically. */
    if (argc > 1 && strcmp(argv[1], "-n") == 0) numeric = 1;
    while(getline(&my_input, &n_bytes, stdin) && strlen(my_input) > 1)
    {
        swap((void **) my_input, 0, 2);
    }

    free(my_input);
    return 0;
}

交换功能与printf-ing进行"调试":

void swap(void *v[], int i, int j)
{
    void *temp;
    printf("i: %d j: %d\n", i, j);
    for(int x = 0; x < strlen(v); x++)
    {
        printf("%c\n", v[x]);
    }
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
    printf("first letter: %c", v[j]);
}

从打印循环中出现的是用户输入的字符串的第一个字符(例如,如果输入==&#34;你好&#34;,打印的第一个字符将是&#39; h&#39; )。打印的其余部分总是垃圾而不是其他字符。打印在v[j]中保存的内容的printf打印出交换的值,该值与第一个字符无关。我猜我错过了一个明显的概念,但似乎无法弄明白。

2 个答案:

答案 0 :(得分:0)

您已经定义了单个维度char数组或char *,并且您尝试转换为vaid * [],它是一个2维数组。用char *替换void * []和使用char temp替换void * temp应该可以在你的程序中使用。 (void *)用于传递泛型指针类型,您必须在访问指针之前转换回原始类型。也只是传递输入字符串,替换(void **)转换。

答案 1 :(得分:0)

你正在处理一个&#34; char&#34;数组,而不是#&#34;指向char&#34;的数组?对吧?

void swapChar(char *v, size_t i, size_t j)
{
    char temp;
    printf("i: %zu j: %zu\n", i, j);
    int x;
    for(x = 0; x < strlen(v); x++)
    {
        printf("%c\n", v[x]));
    }
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
    printf("first letter: %c\n", v[j]));
}

如果你想让它变得通用,你必须告诉它元素的大小:

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

void swap(char *v, size_t i, size_t j, size_t size)
{
    char *temp = malloc(size);
    memcpy(temp, v + i * size, size);
    memcpy(v + i * size, v + j * size, size);
    memcpy(v + j * size, temp, size);
    free(temp);
}

int main(int argc, char *argv[])
{
    char string[] = "Test string";
    swap(string, 0, 1, sizeof *string);
    puts(string);
    return 0;
}

然而,通用版本不能&#34; printf&#34;任何事情,因为swap()不知道如何解释字节。例如,0000000011111111一个short还是两个char?你没有告诉过它。

你也可以在C11中用_Generic宏写一些脏东西。如果您的计划不必严格遵守,您可以利用typeof()