2010-11-10 78 views
10

Tôi muốn khởi tạo chuỗi trong C thành chuỗi rỗng. tôi đã cố gắng:Khởi tạo một chuỗi trong C thành chuỗi trống

string[0] = ""; 

nhưng nó đã viết

"warning: assignment makes integer from pointer without a cast" 

Làm thế nào tôi nên làm điều đó sau đó?

+1

Điểm khai báo chuỗi 0 ký tự là gì? – cdhowie

+0

Loại 'chuỗi' của bạn là gì? Nó là một con trỏ char hay mảng char? – nos

+0

'Chuỗi' là gì? – leppie

Trả lời

5

Giả sử mảng của bạn được gọi là 'chuỗi' đã tồn tại, hãy thử

string[0] = '\0'; 

\0 là NUL terminator rõ ràng, cần thiết để đánh dấu sự kết thúc chuỗi.

+22

Theo thời gian, có nghĩa là 'chuỗi [0] =' \ 0 '; '... –

+0

@badgerr: bạn vui lòng thay đổi câu trả lời của mình để sử dụng'' \ 0''? – pevik

20

Bạn muốn thiết lập các ký tự đầu tiên của chuỗi số không, như thế này:

char myString[10]; 
myString[0] = '\0'; 

(Hoặc myString[0] = 0;)

Hoặc, trên thực tế, trên khởi động, bạn có thể làm:

char myString[10] = ""; 

Nhưng đó không phải là cách chung để đặt chuỗi thành độ dài bằng 0 khi đã được xác định.

+0

Nỗ lực tối thiểu.:) –

+3

'char myString [1] =" ";' chắc chắn? Bạn cần không gian cho null terminator. – JeremyP

+1

Chỉnh sửa: bạn có thể làm 'char myString [10] =" ";' – ruslik

3

Gán xâu để char mảng chỉ được phép trong khai:

char string[] = ""; 

này tuyên bố chuỗi như một mảng char kích thước 1 và khởi tạo nó với \0.

Hãy thử điều này quá:

char str1[] = ""; 
char str2[5] = ""; 
printf("%d, %d\n", sizeof(str1), sizeof(str2)); //prints 1, 5 
12

Ngoài phiên bản Will Dean, sau đây là chung cho toàn bộ khởi đệm:

char s[10] = {'\0'}; 

hoặc

char s[10]; 
memset(s, '\0', sizeof(s)); 

hoặc

char s[10]; 
strncpy(s, "", sizeof(s)); 
1
string[0] = ""; 
"warning: assignment makes integer from pointer without a cast

Ok, hãy đi sâu vào biểu thức ...

0 một int: đại diện cho số ký tự (giả sử string là (hoặc phân hủy thành) một char *) để thăng tiến từ đầu của đối tượng string

string[0]: đối tượng char nằm ở đầu đối tượng string

"": string literal: một đối tượng kiểu char[1]

=: phân công điều hành: cố gắng để chỉ định giá trị loại char[1] cho một đối tượng thuộc loại char. char[1] (bị phân hủy thành char*) và char không được gán tương thích, nhưng trình biên dịch tin tưởng bạn (lập trình viên) và tiếp tục với nhiệm vụ bằng cách truyền loại char* (số char[1] bị phân rã thành) thành int --- và bạn nhận được cảnh báo như một tiền thưởng. Bạn có một trình biên dịch thực sự tốt đẹp :-)

+0

Sẽ nhận được nhiều upvotes hơn nếu nó có một giải pháp; đây là một lời giải thích tốt về những gì đang xảy ra mặc dù. – wizzwizz4

+0

Tôi đồng ý @ wizzwizz4, nhưng tôi thích câu trả lời của tôi. Cảm ơn! – pmg

2

calloc phân bổ bộ nhớ được yêu cầu và trả về một con trỏ đến nó. Nó cũng thiết lập bộ nhớ được cấp phát cho không.

Trong trường hợp bạn đang có kế hoạch sử dụng string chuỗi như trống rỗng của bạn tất cả các thời gian:

char *string = NULL; 
string = (char*)calloc(1, sizeof(char)); 

Trong trường hợp bạn đang có kế hoạch để lưu trữ một số giá trị trong bạn string sau:

char *string = NULL; 
int numberOfChars = 50; // you can use as many as you need 
string = (char*)calloc(numberOfChars + 1, sizeof(char)); 
0

Tôi nghĩ Amarghosh trả lời đúng. Nếu bạn muốn khởi một chuỗi rỗng (mà không biết kích thước) cách tốt nhất là:

//this will create an empty string without no memory allocation. 
char str[]="";// it is look like {0} 

Nhưng nếu bạn muốn khởi tạo một chuỗi với một cấp phát bộ nhớ cố định bạn có thể làm:

// this is better if you know your string size.  
char str[5]=""; // it is look like {0, 0, 0, 0, 0} 
0

Đó là một chút trễ nhưng tôi nghĩ rằng vấn đề của bạn có thể là bạn đã tạo một mảng có độ dài bằng không, chứ không phải là một mảng có độ dài 1.

Chuỗi là một chuỗi ký tự ('\0'). Một chuỗi trống ("") không bao gồm các ký tự theo sau là một ký tự kết thúc chuỗi đơn - tức là một ký tự trong tổng số.

Vì vậy, tôi sẽ thử như sau:

string[1] = ""

Lưu ý rằng hành vi này không phải là mô phỏng bởi strlen, mà không đếm terminator như một phần của chiều dài chuỗi.

Các vấn đề liên quan