如何在C中的多维数组中存储字符串

问题描述 投票:0回答:1

我是C语言的新手,我正在尝试做一个练习,要求插入一些字符串然后存储它们。首先,它请求一个多维数组,其中数组的每一行都有一个字符串,然后是指针数组。这是第一部分的代码。我不知道如何将一些尚未写入的字符串存储到数组中。

对于第二个我不知道,因为我以前从未做过指针练习。

#include <stdio.h>

int main(){
int n; //number of strings
int x; //number of characters per string

    printf("How many strings do you want to insert?");
    scanf("%d", &n);

    if ((n >= 1) && (n <= 20)){
        printf("How many characters per string?");
        scanf("%d", &x);
        char str[x];

            if (x <= 10){
                for(int i = 0; i < n; i++){
                    printf("Insert a string:");
                    scanf("%s", str);
                    for(int j = 0; j < x; j++){
                        char arr[j];
                        arr[j] = str[x];
                        printf("%s", arr);
                    }
        }
            }
            else {
                printf("Error:the number of characters must be < 10");
            }
    }
    else {
        printf("Error: the number must be < 20");
    }

return 0;
}


c string multidimensional-array
1个回答
2
投票

...请求一个多维数组,其中数组的每一行都有一个字符串,然后是指针数组。

获得合格的字符串数后,分配一个指向char的指针的数组。

if ((n >= 1) && (n <= 20)){
  char **string_list = calloc(n, sizeof *string_list);
  assert(string_list);  // or other error checking

((请注意= calloc(n, sizeof *string_list);中没有类型。更容易编码,检查和维护。)

读取正在工作的临时缓冲区中的字符串。如“每个字符串多少个字符?”可能意味着字符数[[not包括null character,我们的str[]的大小需要为+1。

// char str[x]; // too small char str[x+1];
但是我们知道x <= 10,并且可以使用固定的缓冲区大小和限制输入长度

for(int i = 0; i < n; i++){ char str[10+1]; printf("Insert a string:"); scanf("%10s", str); // Notice the 10 - a width limit // TBD check if scanf() returned 1 and if str is longer than x

现在分配str的副本

string_list[j] = strdup(str); assert(string_list[j]); // or other error checking }

稍后,用string_list[]clean-up和自由分配完成。

for (int i=0; i<n; i++) { free(string_list[i]); } free(string_list);


这有什么缺点:

它使用scanf()而不是fgets(),然后进行分析,具有最少的错误检查,不使用空格插入

strings

,不处理超长输入,strdup() is not standard -yet所以以上是一个小步骤。更好的代码可以解决这些薄弱的问题。
© www.soinside.com 2019 - 2024. All rights reserved.