2011-11-08 38 views
7

Tôi muốn chia nhỏ một câu và lưu trữ mỗi chuỗi trong một mảng. Đây là mã của tôi:Phá vỡ chuỗi và lưu trữ nó trong mảng

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

int main(void) 
{ 
    int i = 0; 
    char* strArray[40]; 
    char* writablestring= "The C Programming Language"; 
    char *token = strtok(writablestring, " "); 


    while(token != NULL) 
    { 
     strcpy(strArray[i], token); 
     printf("[%s]\n", token); 
     token = strtok(NULL, " "); 
     i++; 
    } 
    return 0; 
} 

Nó vẫn cho tôi lỗi phân đoạn và tôi không thể hiểu được. Tôi tin rằng nó có một cái gì đó để làm khi tôi sao chép mã thông báo cho mảng của tôi.

Trả lời

12

Vì không thể ghi được writablestring. Cố gắng ghi vào một chuỗi ký tự là hành vi không xác định và strtok ghi vào nó (đúng vậy, strtok sửa đổi đối số của nó).

Để làm cho nó làm việc, hãy thử:

char writablestring[] = "The C Programming Language"; 

Ngoài ra còn có một C FAQ.

Một vấn đề khác là bạn không cấp phát bộ nhớ cho mảng con trỏ ký tự của bạn (do đó các con trỏ trỏ đến không có gì).

char* strArray[40]; /* Array of 40 char pointers, pointing to nothing. */ 

Có thể thử điều này?

/* Careful, strdup is nonstandard. */ 
strArray[i] = strdup(token); 

/* Or this. */ 
strArray[i] = malloc(strlen(token) + 1); 
strcpy(strArray[i], token); 
+0

Yeap, mẹo đó đã xảy ra! cảm ơn! –

+0

+1: Bạn đánh tôi với nó –

1

Có một cái nhìn tại the example in the docs:

char * strtok (char * str, const char * delimiters); 

... nơi ...

str - chuỗi C để cắt ngắn. Nội dung của chuỗi này được sửa đổi và chia thành các chuỗi nhỏ hơn (mã thông báo). Alternativelly, một con trỏ null có thể được chỉ định, trong trường hợp đó hàm tiếp tục quét khi một cuộc gọi thành công trước đó đến hàm kết thúc.

dấu phân cách - chuỗi C chứa dấu tách. Các thông tin này có thể thay đổi từ một cuộc gọi này sang một cuộc gọi khác.

Giá trị trả lại - Con trỏ đến mã thông báo cuối cùng được tìm thấy trong chuỗi. Một con trỏ null được trả về nếu không có mã thông báo nào để truy xuất.

Bạn cần chuỗi đầu tiên đó để tôi có thể sửa đổi và bạn cần cấp phát bộ nhớ cho đầu ra, ví dụ:

int main(void) 
{ 
    int i = 0; 
    const int numOfStrings = 128; 
    char* strArray[numOfStrings]; 
    char writablestring[]= "The C Programming Language"; 
    char *token = strtok(writablestring, " "); 

    for(int j = 0; j < numOfStrings; j++) 
    { 
     strArray[j] = new char[40]; 
    } 

    while(token != NULL) 
    { 
     strcpy(strArray[i], token); 
     printf("[%s]\n", token); 
     token = strtok(NULL, " "); 
     i++; 
    } 
    return 0; 
} 
Các vấn đề liên quan