2013-05-01 32 views
9

bình thường, strlen() không tính null terminator ở cuối chuỗi. Nhưng, dưới đây mã in chuỗi đếm với null terminator. Bất cứ ai có thể giải thích cho tôi tại sao? Cảm ơnstrlen() trả về số chuỗi với null terminator

char str2[100]; 
printf("\nEnter a string: "); 
fgets (str2, sizeof(str2), stdin); 
printf("\n%d",strlen(str2)); 
+11

Có thể đếm '\ n' thay vì' \ 0' –

+0

Vậy bạn đã nhập chuỗi gì và kết quả là gì? –

+0

có thể trùng lặp của [fgets() thêm dòng mới vào cuối] (http://stackoverflow.com/questions/13443793/fgets-adds-newline-at-the-end) –

Trả lời

34

Tôi giả định dấu nhắc fgets trước đó đã chọn ký tự newline.

Ví dụ:

Bạn đặt trong apple.

Chuỗi nội bộ của bạn được lưu trữ dưới dạng apple\n\0.

strlen sau đó trở 6 cho apple + '\n'

+1

Giải thích hay. Chào mừng bạn đến với SO! –

+1

Cảm ơn @luserdroog :) –

+0

@hmdb bạn có thể chấp nhận điều này làm câu trả lời không? – Gewure

0

fgets() đọc cho đến khi \n đang gặp phải.

Nếu người dùng nhập anshul thì str2 sẽ chứa anshul\n\0.

strlen() sẽ trả về 7 vì strlen() tìm kiếm cho đến khi tìm thấy ký tự NULL ('\ 0').

2

Tại đây bạn đã sử dụng hàm fgets() để nhập liệu. Khi bạn lấy đầu vào bởi hàm fgets() thì một ký tự dòng mới bổ sung ('\ n') sẽ được thêm vào với dấu vết của bạn. giả sử đầu vào của bạn là: "hello". sau khi gõ sting này, bạn phải bấm phím ENTER cho nhân vật dòng mới sẽ được thêm vào với chuỗi của bạn. Do đó có vẻ như bạn rằng strlen() đếm null terminator. Nhưng nếu bạn lấy đầu vào bằng hàm scanf(), nó sẽ không thêm ký tự dòng mới bổ sung ('\ n') khi nhấn ENTER. Vì vậy, bạn sẽ thấy chính xác số ký tự mà chuỗi bạn chứa. Chạy đoạn mã sau để xem giải thích của tôi.

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

void main() 
{ 
char str2[100]; 
printf("\nEnter a string: "); 
scanf("%s",str2); 
//fgets (str2, sizeof(str2), stdin); 
printf("\n%d",strlen(str2)); 
} 
3

Các fgets() chức năng chấp nhận đầu vào khi một ký tự xuống dòng (Enter khi sử dụng stdin) đang gặp phải, và kí tự xuống dòng \n được coi là một nhân vật có giá trị của các chức năng và nằm trong chuỗi sao chép vào str2 của bạn. Do đó, khi bạn chuyển nó thành tham số strlen(), nó sẽ cho nhiều hơn một số ký tự ban đầu trong chuỗi của bạn để tính thêm ký tự \n.

Nếu bạn muốn số ký tự gốc hoặc không muốn thêm \n, hãy sử dụng hàm gets() vì nó không sao chép ký tự dòng mới.Và hơn nữa, bạn chỉ cần chuyển chuỗi làm đối số, không cần phải truyền luồng (stdin) làm luồng mặc định cho gets()stdin.

char str2[100]; 
printf("\nEnter a string: "); 
gets(str2); 
printf("\n%d",strlen(str2)); 
0

được (s) không bao gồm các '\ n' khi bạn nhấn vào phím sau khi nhập xong string.But, fgets() không bao gồm các '\ n' khi đọc từ một tập tin.

Theo man page (sử dụng: người đàn ông fgets) trên thiết bị đầu cuối Linux,

fgets() đọc trong ít nhất một ít hơn nhân vật có kích thước từ suối và lưu trữ chúng vào bộ đệm được trỏ đến bởi s. Việc đọc dừng sau một EOF hoặc một dòng mới .Nếu một dòng mới được đọc, nó được lưu vào bộ đệm. Một byte null kết thúc ('\ 0') được lưu trữ sau ký tự cuối cùng trong bộ đệm.

0

như được người khác nêu, fgets() sẽ đọc ký tự dòng mới (\ n) và lưu nó trong mảng của bạn.

sau mỗi cuộc gọi đến fgets() Tôi luôn sử dụng strcspn() để tìm kiếm mảng/con trỏ để tìm ký tự dòng mới và thay thế bằng ký tự null.

char str2[100]; 
printf("\nEnter a string: "); 
fgets (str2, sizeof(str2), stdin); 

//new line of code to replace '\n' with '\0' 
str2[strcspn(str2, "\n")] = '\0'; 

printf("\n%d",strlen(str2)); 
Các vấn đề liên quan