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