c - 无法访问字符指针数组

标签 c arrays string pointers

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 256
int main() {
    int partsize, len = 0;
    int j, k, n, i = 0;
    char* str1 = (char*)malloc(sizeof(char) * size);
    // char *str2=(char*)malloc(sizeof(char)*size);
    // int *count=(int*)calloc(size,sizeof(int));
    scanf("%[^\n]%*c", str1);
    scanf("%d", &n);
    // scanf("%[^\n]%*c",str2);
    //  printf("%s %s",str1,str2);
    char* temp = (char*)malloc(sizeof(char) * size);
    char** p = (char**)calloc(n, sizeof(char*));
    len = strlen(str1);
    if (len % n != 0) {
        printf("Sorry");
    } else {
        k = 0;
        p = temp;
        partsize = len / n;
        for (j = 0; j < len; j++) {
            *(temp + k) = str1[j];
            if ((j + 1) % partsize == 0) {
                *(temp + k) = "\n";
                p++;
                p = temp + k + 1;
            }
        }
        for (i = 0; i < n; i++) {
            printf("%s", *(*(p + i)));
        }
    }

    return 0;
}

我想将字符串分成 n 个相等的部分。但是当我运行此代码时,我没有得到任何输出。我认为问题出在指向字符的指针数组的指针上。请帮忙。

最佳答案

下面是一个示例,说明如何以更简单的方式动态分配所有需要的内存。这允许您处理任何长度的字符串。另外,请注意 getline 的使用。它提供了返回读取的字符串长度(包括空终止字符)的优点。内嵌注释进行了解释。

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

int main() {

    size_t partsize = 0;
    size_t end = 0;
    ssize_t read = 0;
    ssize_t len = 0;

    int i = 0;
    int n = 0;
    char *ptr = NULL;
    char *str1 = NULL;

    printf ("\n  Please enter a string (of n parts)   : ");
    if ((read = getline (&str1, &end, stdin)) == -1) {
        fprintf (stderr, "\nError: str1 returned no characters.\n\n");
        return 1;
    }
    printf ("  Enter the number of parts for string : ");
    scanf("%d", &n);
    printf ("\n");

    /* create n char pointers to hold equal parts of str1 */
    char** p = calloc (n, sizeof(char*));
    len = read - 1;     /* null-terminator added by getline */
    partsize = len / n;
#ifdef DEBUG
    printf ("  partsize: %zd, n: %d, len: %zd, str1: %s\n", partsize, n, len, str1);
#endif /* DEBUG */

    if (len % n != 0) {
        printf("Sorry");
    } else {

        ptr = str1;                         /* assign ptr to str1 */

        for (i = 0; i < n; i++) {           /* for each part      */
            p[i] = strndup (ptr, partsize); /* dup partsize chars */
            ptr += partsize;                /* advance pointer    */
        }

        for (i = 0; i < n; i++) {
            printf("  p[%d]: %s\n", i, *(p + i));
        }

        printf ("\n");
    }

    return 0;
}

构建:

gcc -Wall -Wextra -o bin/captr captr.c

使用 DEBUG 构建(如果需要):

gcc -Wall -Wextra -o bin/captr captr.c -DDEBUG

输出:

$ ./bin/captr

Please enter a string (of n parts)   : 012345678901234567890123456789
Enter the number of parts for string : 3

p[0]: 0123456789
p[1]: 0123456789
p[2]: 0123456789

关于c - 无法访问字符指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25173523/

相关文章:

c - 验证用户输入字符串

c - 使用 OpenMP 和 block 方法加速矩阵乘法 : Can I Do Better?

ios - 如何存储字典数组并将其显示在 swift 4 的 Collection View 中

java - 数组中的元素,使得其左侧元素的总和等于其右侧元素的总和

arrays - Swift 4.2 解析 json 以在 UIPickerview 上使用它

Android - 在代码中动态命名资源

java - 从 HTML 中提取数据并格式化输出

c - 与进程树中的兄弟共享PID

c# - 带有重载的字符串比较

比较两个字符导致超时 : the monitored command dumped core