问题将字符指针转换为 void 指针以用于交换功能
issue converting character pointer to void pointer for swap function
我正在尝试交换 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 交换函数 "debugging":
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]);
}
打印循环中出现的是用户输入的字符串的第一个字符(例如,如果输入== "hello",打印的第一个字符将是'h')。打印的其余部分总是垃圾,而不是其余字符。打印 v[j]
中保存的内容的 printf 打印出交换值,该值将是第一个字符。我猜我错过了一个明显的概念,但似乎无法弄清楚。
您已经定义了一个单维字符数组或 char *,并且您正在尝试转换为 vaid*[],它是一个二维数组。将 void*[] 替换为 char* 并将 void *temp 替换为 char temp 应该在您的程序中有效。 (void *) 用于传递通用指针类型,您必须在访问指针之前转换回原始类型。也只需按原样传递输入字符串替换 (void **) 转换。
您正在处理 "array of char",而不是 "array of pointer to char",对吗?
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;
}
但是通用版本不能"printf"任何东西,因为swap()
不知道如何解释字节。例如,0000000011111111
是一个 short
还是两个 char
?你没有告诉它。
你也可以在 C11 中用 _Generic
宏写一些脏东西。如果您的程序不必严格遵守,您可以利用 typeof()
.
我正在尝试交换 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 交换函数 "debugging":
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]);
}
打印循环中出现的是用户输入的字符串的第一个字符(例如,如果输入== "hello",打印的第一个字符将是'h')。打印的其余部分总是垃圾,而不是其余字符。打印 v[j]
中保存的内容的 printf 打印出交换值,该值将是第一个字符。我猜我错过了一个明显的概念,但似乎无法弄清楚。
您已经定义了一个单维字符数组或 char *,并且您正在尝试转换为 vaid*[],它是一个二维数组。将 void*[] 替换为 char* 并将 void *temp 替换为 char temp 应该在您的程序中有效。 (void *) 用于传递通用指针类型,您必须在访问指针之前转换回原始类型。也只需按原样传递输入字符串替换 (void **) 转换。
您正在处理 "array of char",而不是 "array of pointer to char",对吗?
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;
}
但是通用版本不能"printf"任何东西,因为swap()
不知道如何解释字节。例如,0000000011111111
是一个 short
还是两个 char
?你没有告诉它。
你也可以在 C11 中用 _Generic
宏写一些脏东西。如果您的程序不必严格遵守,您可以利用 typeof()
.