我正在对函数,指针和数组进行一些练习,而且我很难让这个程序运行和编译。基本上我正在尝试声明一个数组,然后使用一个函数将输入数组中的值存储到指针char数组中,然后输出指针数组,但我似乎无法让它工作。
以下是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void cut_alphabet(char a[]);
char convert(char b[]);
int main()
{
char array[10][1000];
int i;
for(i=0; i<10; i++)
{
printf(" Please input a string value");
fgets( array[i], 1000, stdin);
}
convert(array[10]);
return 0;
}
char convert(char b[])
{
int i;
char *psentence[10][1000];
for( i=0; i<10; i++)
{
b[i] = &psentence[i];
return psentence;
}
答案 0 :(得分:0)
有些事情是错误的,所以请耐心等待:
int main() {
char array[10][1000]; // Ok, Note that you will use these ~10 kB of data for as long as the program runs.
int i;
for(i=0; i < 10; i++) {
printf(" Please input a string value");
fgets( array[i], 1000, stdin);
}
// This next line has an error in your code, what you are saying here is:
// Send in the 11th string in "array", however array only has
// 10 strings so this will not work as intended.
// If you wish to send in ALL 10 strings just write convert(array)
// and change the function prototype to char ** convert(char array[][1000]).
// Please note that the the [1000] must always match between the function and a
// Statically allocated two-dimensional array. (One reason to prefer pointers
// in this use-case.
convert(array);
return 0;
}
我稍微不确定你在这里想要实现的目标......你想将psentence复制到b吗?如果是这样,你想要什么?目前它只是未初始化的数据,在您的代码中看起来像垃圾。如果你想要将二维数组转换为一个char指针数组,那就更有意义了。所以我会继续......
<强>假设强>
以下两个不同的实现执行基本相同的操作,用b指向字符串的指针填充数组。
此版本将数组存储为元素作为参数, 这是必需的,因为即使从函数返回后我们也需要指针数组。 另请注意,在这种情况下,返回值可以更改为void。
void convert(char* ptr_arr[], char b[][1000], int lines ) {
int i;
for( i=0; i<lines; i++) {
ptr_arr[i] = b[i]; // b[i] yields a pointer to the i'th line.
}
}
此版本返回带有指针的新动态分配数组。 请注意,以后必须通过调用free来释放分配的数据。 C中的Google动态内存分配可获得更多信息。
char** convert(char b[][1000], int lines ) {
char **ptr_arr = malloc(sizeof(char*)*lines +1 ); // Allocate enough space for lines +1 pointers.
// Check that allocation succeeded.
if (ptr_arr == NULL) return NULL;
int i;
for( i=0; i<lines; i++) {
ptr_arr[i] = b[i];
}
// Use a NULL ptr to mark the last element (this is optional)
ptr_arr[lines] = NULL;
// Finally, return the new table:
return ptr_arr;
}