2016-05-14 131 views
4

我在我的主函数中切换的情况4中不断崩溃,并且无法修复它。从一个函数中的数组中打印字符串C

我会解释一下代码,希望你们能帮助我:

初始化函数

void function1(char[]); 

声明字符串

const char *my_array[] = { 
"Array of strings one", 
"Array of strings two", 
"Array of strings three"}; 

通过数组循环数组主函数中的字符串(这能正常工作,它打印字符串数组)

int i; 
for (i=0; i < 3; i++) { 
    printf("%s\n", my_array[i]); 
} 

在开关函数的代码(仍然在主函数)

case 4: 
      function1(my_array); 
      break; 

我测试过,所有以前的代码的工作正常,问题是在这里(主要功能外):

void function1(char my_array[]) { 
for (i=0; i < 3; i++) { 
    printf("%s\n", my_array[i]); 
} 
printf("\n");} 

当我执行开关的情况4时,它崩溃。

的2警告日志给出:

警告:传递 '功能1' 的参数1不兼容的指针 类型

警告:格式 '%s' 的期望类型 '字符*' 的参数但争论2 具有类型“诠释” [-Wformat =]

很抱歉,如果它是一个有点不清楚我想很难,因为我可以为它是很容易理解的解释。

我真的希望你们能帮助我,谢谢!

+2

你不能传递一个'的char []',你传递'char * []'或'char **' –

回答

9

的第一个警告,即

警告:从兼容的指针类型

过客“功能1”的参数1讲述了:要传递字符指针数组,但功能声明说它需要一个简单的字符指针。

第二个警告会告诉你从函数内部的同一件事:

警告:格式“%s”的预期类型“的char *”的说法,但参数2的类型为“INT” [ -Wformat =]

格式想要一个C字符串,而是要传递一个char*

所有你需要做的,解决这个问题是缺少一个星号添加到的function1声明:

void function1(const char *my_array[]) 
//    ^^^^^ ^

当你在它,添加constmy_array声明中main匹配。

*编译器说,你是传递一个int,不char,因为printf采用可变数量的参数,所以编译器应用某些转换到函数的参数。其中一项转型是将所有char s推广至int s。

+1

它应该是'void function1(const char * my_array [])'以匹配main中'my_array'变量的声明。 – mch

+0

@mch你说得对,OP也应该加上'const'。谢谢! – dasblinkenlight

1

请有在函数减速细看

无效功能1(CHAR my_array [])

你传入字符数组是字符串(这显然你不希望) 。第二个问题是这条线,

printf("%s\n", my_array[i]); 

当你说my_array [I],你想在“我”的位置来访问字符和用%s打印字符(这是一个崩溃)。要打印字符,你应该写这个

printf(%c\n", my_array[i]); 

现在,让我们根据您的要求修改代码,你应该有一个函数,它接受字符指针(或字符串)的阵列

void function1(const char* my_array[]) 
{ 
    for (size_t i = 0; i < 3; i++) 
    { 
     printf("%s\n", my_array[i]); 
    } 
    printf("\n"); 
} 

请注意使用'const'(如果你只需要读取/打印字符串数组中的数据)。请考虑发送数组的大小,并使用该大小来遍历循环。

void function1(const char* my_array[], size_t n) 
{ 
    for (size_t i = 0; i < n; i++) 
    { 
     printf("%s\n", my_array[i]); 
    } 
    printf("\n"); 
} 
1

玉家伙我已经尝试了所有的解决方案,当我在函数中添加“常量”它给了我一个错误“错误冲突的类型”。

读你们所有人我发现我只是在函数中传递一个字符而不是字符串(在函数和函数的初始化中缺少*)。

我改变了这个:

void function1(char[]); 

要这样:

void function1(char*[]); 

这:

void function1(char my_array[]) { 
    for (i=0; i < 3; i++) { 
    printf("%s\n", my_array[i]); 
    } 
    printf("\n"); 
} 

这样:

void function1(char* my_array[]) { 
    for (i=0; i < 3; i++) { 
    printf("%s\n", my_array[i]); 
    } 
    printf("\n"); 
} 

它就像一个魅力!

对不起,如果这是一个noob问题,但我从C编程开始。

谢谢大家的回答我很感激!

+0

:)很高兴听到!保持! – Bishop

0

假设你想要的遍历数组中的元素,并打印其所有内容的功能,这里是我的建议:

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


void view(char *array[]){ 
    int i; 
    for (i = 0; i < sizeof(array)/sizeof(char); i++){ 
     //sizeof(array)/sizeof(char) = length of any array   
     printf("\nElement -> %s",array[i]); 
    } 
} 


int main() { 

    char *arr[] = {"String One", "String Two", "String Three"}; 

    view(arr); //Calling the function 

    return 0; 
} 
相关问题