如何将字符串从char数组传递给指针char数组?

时间:2014-07-14 05:46:02

标签: c

我正在对函数,指针和数组进行一些练习,而且我很难让这个程序运行和编译。基本上我正在尝试声明一个数组,然后使用一个函数将输入数组中的值存储到指针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; 

     }

1 个答案:

答案 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 [] []的寿命比返回值长,因此我们不需要复制数据。

以下两个不同的实现执行基本相同的操作,用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;
}