【问题标题】:Passing an array of strings to a function where the strings are taken from the user将字符串数组传递给从用户那里获取字符串的函数
【发布时间】:2021-02-16 01:17:42
【问题描述】:

我想创建一个字符串数组,用户可以在其中定义数组中的项目。也就是说,我会要求用户输入数组的元素(使用scanf)。我还有一个打印该数组元素的函数。所以,我想将字符串数组传递给该函数。

我已尝试对此进行大量研究,但无法理解任何内容。我遇到了一个解决方案,我可以使用 char ** 将字符串数组传递给函数,但无法在运行时定义元素。

这是我遇到的解决方案。

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

void print(char **, int size);

int main(){

    char *stringArray[3];

    stringArray[0] = "Word0";
    stringArray[1] = "Word1";
    stringArray[2] = "Word2";

    print(stringArray, 3);

    return 0;
}

void print(char **ptr, int size){
    int i;

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

但我希望用户输入元素。像这样的东西,但这不起作用。 (为什么?)

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

void print(char **, int size);

int main(){

    char *stringArray[3];

    for(int i=0; i<3; i++){
        scanf("%s", stringArray[i]);
    }
    
    print(stringArray, 3);

    return 0;
}

void print(char **ptr, int size){
    int i;

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

指向指针char ** 的指针的概念对我来说是新的,我希望您向我解释这一点,就像您向一个完整的初学者解释这一点一样。 对此的任何帮助都将受到高度赞赏。提前谢谢你。

【问题讨论】:

    标签: arrays c string pointers multidimensional-array


    【解决方案1】:

    在使用指针之前,你必须为字符串分配一些缓冲区。

    int main(){
    
        char *stringArray[3];
    
        for(int i=0; i<3; i++){
            stringArray[i] = malloc(1024 * 1024); /* allocate buffer, hoping user input won't be so long */
            if (stringArray[i] == NULL) { /* check if allocation is successful */
                perror("malloc");
                return 1;
            }
            scanf("%s", stringArray[i]);
        }
    
        print(stringArray, 3);
    
        for(int i=0; i<3; i++){
            free(stringArray[i]); /* free allocated things */
        }
    
        return 0;
    }
    

    欲了解更多信息,请参阅c - Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized pointer - Stack Overflow

    【讨论】:

      猜你喜欢
      • 2016-12-08
      • 2014-09-06
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2022-11-26
      相关资源
      最近更新 更多