2014-05-12 37 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define N 24 

void rez(char **c, char *s, int n, int ks); 

void rez(char **c, char *s, int n, int ks) 
{ 
    int t = 0, j = 0; 
    char *p; 
    p = strtok(s," "); 
    t = t + strlen(p); 
    if (strlen(p)>N) *(c+j)=(char*)malloc((strlen(p)+1)*sizeof(char)); 
    else *(c+j)=(char*)malloc((N+1)*sizeof(char)); 
    while(p!=NULL) 
    { 
     if (t>N) 
     { 
      *(*(c+j)+t) = '\0'; 
      t = strlen(p) + 1; 
      j++; 
      if (t>N) *(c+j)=(char*)malloc(strlen(p)+1); 
      else *(c+j)=(char*)malloc(N+1); 
     } 
     strcat(*(c+j), p); 
     c[j][t]=' '; 
     p = strtok(NULL, " "); 
     t=t+strlen(p)+1; 
    } 
    c[j][t]='\0'; 
    for(j=0; j<ks; j++) 
    { 
     printf("\n %s", *(c+j)); 
    } 
} 

int main(void) 
{ 
    FILE *fin; 
    int n, ks; 
    char s1[2048], filename[256]; 
    char **c; 

    printf("Enter the file name->"); 
    scanf("%s", filename); 
    fin=fopen(filename,"r"); 
    if (!fin) 
    { 
     printf ("Error\n"); 
     return -1; 
    } 
    while (fscanf(fin, "%[^\n]", s1)==1) 
    { 
     fscanf(fin, "%*[ \n]"); 
     printf("\n String: %s \n", s1); 
     n=strlen(s1); 
     ks=n/(N-1)+1; 
     c=(char **)malloc(ks*sizeof(char*)); 
     rez(c, s1, n, ks); 
    } 
    fclose(fin); 
    return 0; 
} 

此代碼應該將較長的字符串縮短爲一些較短的字符串,但它會在gcc中產生「核心轉儲」。它不在void rez()中退出。將較長的字符串切割成更短的東西

在我看來,strtok()工作不正常。

+3

請格式化你的代碼正確 –

+2

第1步,對我來說,將重命名所有這些單字符變量名的東西是有用的。(和步驟2,當然,是使用調試器。) – usr2564301

+2

而且步驟3中,改變所有的討厭的指針引用到簡單和可讀的數組符號,例如' *(*(c + j)+ t)='';' - >'c [j] [t] ='';' –

回答

0

這是錯誤的:

char r[1]=" "; 

因爲字符串字面" "是兩個字符!它既是一個空間和空終止符(這是在每一個C.字符串的結束,但您明確說,這應該只是一個1個字符數組。

+0

將其更正爲TWO,但它並沒有幫助 – user3629493