【问题标题】:Printing strings from an array in a function in C在 C 中的函数中从数组中打印字符串
【发布时间】:2016-05-14 09:12:26
【问题描述】:

我在我的主要功能中的开关的案例 4 中不断崩溃,无法修复它。

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

初始化函数

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]);
}

switch函数中的代码(还在main函数中)

case 4:
            function1(my_array);
            break;

我已经测试过,之前的所有代码都可以正常工作,问题出在此处(在 main 函数之外):

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

当我执行 switch 的 case 4 时,它崩溃了。

日志给出的 2 个警告:

警告:从不兼容的指针传递 'function1' 的参数 1 输入

警告:格式“%s”需要“char *”类型的参数,但参数 2 具有类型“int”[-Wformat=]

抱歉,如果解释有点不清楚,我尽我所能使它易于理解。

真的希望大家能帮帮我,谢谢!!

【问题讨论】:

  • 你没有传递char [],你传递的是char *[] 或char **

标签: c arrays string


【解决方案1】:

第一个警告,即

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

讲故事:你正在传递一个字符指针数组,但函数声明说它需要一个简单的字符指针。

第二个警告从函数内部告诉你同样的事情:

警告:格式“%s”需要“char *”类型的参数,但参数 2 的类型为“int”[-Wformat=]

格式需要一个 C 字符串,但您传递的是单个 char*。

您需要做的就是在function1 的声明中添加一个缺失的星号:

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

当您使用它时,添加const 以匹配main 中my_array 的声明。

*编译器说您传递的是int,而不是char,因为printf 采用可变数量的参数,因此编译器对函数的参数应用了某些转换。其中一种转换是将所有chars 提升为ints。

【讨论】:

  • 应该是void function1(const char *my_array[])来匹配main中my_array变量的声明。
  • @mch 你说得对,OP 也应该加上const。谢谢!
【解决方案2】:

请仔细看看减速功能

void function1(char my_array[])

您正在传入 char 数组,它是字符串(显然您不想要)。第二个问题是这条线,

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

当您说 my_array[i] 时,您正在尝试访问位于 'i' 位置的 字符 并使用 %s 打印一个字符(这是一个崩溃)。要打印一个字符,你应该这样写

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

现在让我们根据您的要求修复代码,您应该有一个函数来获取 char 指针数组(或字符串)

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");
}

【讨论】:

    【解决方案3】:

    好的,伙计们,我已经尝试了你所有的解决方案,当我在函数中添加“const”时,它给了我一个错误“冲突类型中的错误”。

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

    我改变了这个:

    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");
    }
    

    它就像一个魅力!

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

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

    【讨论】:

    • :) 很高兴听到!继续加油!
    【解决方案4】:

    假设您想要一个循环遍历数组元素并打印其所有内容的函数,这就是我的建议:

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多