C语言 如何将字符串复制到动态二维数组中?[已关闭]

db2dz4w8  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(103)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

昨天关门了。
Improve this question
我必须将流输入的结果字符串复制到二维数组的字符串中。是否有可能做到这一点?我的代码中有什么问题?
任务是获取char()字符串并将其放入二维数组中

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

int main()
{
    char *arr = NULL;
    char string[50];
    char sym;

    int counter = 0;
    int counter_str = 0;
    int i = 0;

    while((sym = getchar()) != EOF)
    {
        if((sym != ' ') && (sym != ('\t') && (sym != '\n'))){
            string[counter] = sym;
            counter += 1;
            }
            
        if(sym == '\n'){
            string[counter] = sym;
            counter += 1;
            counter_str += 1;
            string[counter] = '\0';
            
            arr = (char*) realloc(arr, counter_str * sizeof(char));
            arr[counter_str - 1] = malloc(1 + strlen(string));
            strcpy(arr[counter_str - 1], string);
            counter = 0;
        }
    }
}
cbjzeqam

cbjzeqam1#

  1. char *arr是一个字符的指针,而不是你所想的二维数组。
  2. getchar()会传回整数,而EOF通常会定义为-1。如果charsignedunsigned,则会实作定义。
#define _XOPEN_SOURCE 500
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STR_LEN 50

int main() {
    char **arr = NULL;
    char string[STR_LEN];
    int counter = 0;
    int counter_str = 0;
    for(; counter + 1 < STR_LEN;) {
        int sym = getchar();
        if(sym == EOF)
            break;
        if(sym != ' ' && sym != '\t')
            string[counter++] = sym;
        if(sym == '\n') {
            string[counter] = '\0';
            char **tmp = realloc(arr, (counter_str + 1) * sizeof(*arr));
            if(!tmp) {
                printf("realloc failed\n");
                return 1;
            }
            arr = tmp;
            arr[counter_str] = strdup(string);
            if(!arr[counter_str]) {
                printf("strdup failed\n");
                return 1;
            }
            counter = 0;
            counter_str++;
        }
    }
    for(int i = 0; i < counter_str; i++) {
        printf("%s", arr[i]);
        free(arr[i]);
    }
    free(arr);
}

和运行示例:

hello world
again
helloworld
again

除非你非常关心如何容纳尽可能多的非空格和非制表符字符,否则直接读取然后剥离字符串可能会更清楚:

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

#define STR_LEN 50

void strip(char *s, const char *accept) {
    for(;;) {
        s = strpbrk(s, accept);
        if(!s)
            break;
        *s = s[1];
    }
}

int main(void) {
    char **arr = NULL;
    for(size_t i = 0;; i++) {
        char **tmp = realloc(arr, (i + 1) * sizeof(*arr));
        if(!tmp) {
            printf("realloc failed\n");
            return 1;
        }
        arr = tmp;
        arr[i] = malloc(STR_LEN);
        if(!arr[i]) {
            printf("malloc failed\n");
            return 1;
        }
        if(!fgets(arr[i], STR_LEN, stdin)) {
            free(arr[i]);
            arr[i] = NULL;
            break;
        }
        strip(arr[i], " \t");
    }
    for(size_t i = 0; arr[i]; i++) {
        printf("%s", arr[i]);
        free(arr[i]);
    }
    free(arr);
}

特别是如果你可以限制字符串的数目(N):

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

#define N 3
#define STR_LEN 50

void strip(char *s, const char *accept) {
    for(;;) {
        s = strpbrk(s, accept);
        if(!s)
            break;
        *s = s[1];
    }
}

int main(void) {
    char arr[N][STR_LEN];
    for(size_t i = 0; i < N; i++) {
        if(!fgets(arr[i], STR_LEN, stdin))
            break;
        strip(arr[i], " \t");
    }
    for(size_t i = 0; *arr[i]; i++) {
        printf("%s", arr[i]);
    }
}

相关问题