无法访问字符指针数组

时间:2014-08-07 03:13:05

标签: 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个相等的部分。但是当我运行此代码时,我没有得到任何输出。我认为问题是指向指向字符的指针数组的指针。请帮助。

2 个答案:

答案 0 :(得分:1)

以下是一个示例,说明如何以更简单的方式动态分配所有需要的内存。这允许您处理任何长度的字符串。另请注意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

答案 1 :(得分:0)

您在代码中遇到各种问题:

  • k永远不会在循环中更新。
  • printf在遇到\n时不会停止打印,只有在NULL(\0)时才会停止打印。
  • 您正在递增指针(特别是循环中的p)而不是重新启动到初始位置以打印结果(在更新位置使用p打印的最后一个循环中)。

代码(经测试的GCC 4.9.0),在此代码中我尝试尽可能少地更改您的代码。请参阅改进版本以获得更好的效果:

#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** p;
    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** pp = (char**)calloc(n, sizeof(char*));
    len = strlen(str1);
    if (len % n != 0) {
        printf("Sorry");
    } else {
        k = 0;
        p = pp;
        *p = temp;
        partsize = len / n;
        for (j = 0; j < len; j++, k++) {
            *(temp + k) = str1[j];
            if ((j + 1) % partsize == 0) {
                k++;
                *(temp + k) = '\0';
                p++;
                *p = temp + k + 1;
            }
        }
        p = pp;
        for (i = 0; i < n; i++) {
            printf("%s\n", *(p + i));
        }
    }

    return 0;
}

这里是改进代码:

  • 无需将输入字符串复制到另一个缓冲区。在此示例中,请在原始代码中将temp视为p
  • 您只需要保存分割位置并在两者之间打印字符。

改善代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 256
int main() {
    int n, i, j, k;

    char* str1 = (char*)malloc(sizeof(char) * size);
    scanf("%[^\n]%*c", str1);
    scanf("%d", &n);

    int len = strlen(str1);
    if (len % n != 0) {
        printf("Sorry");
    } else {
        int partsize = len / n;
        char** temp = (char**)malloc(sizeof(char*) * partsize);
        k = 0;
        for (j = 0; j < len; j += partsize, k++) {
            temp[k] = &str1[j];
        }
        for (i = 0; i < n; i++) {
            printf("%.*s\n", partsize, temp[i]);
        }
    }

    return 0;
}

测试输入:

123456789101112
3

两个来源获得的输出:

12345
67891
01112

编译:{{1​​}}