Trong đoạn mã dưới đây, các dòng:lỗi Segmentation - char trỏ
*end = *front;
đưa ra một lỗi phân khúc. Tôi hỏi một câu hỏi tương tự here nhưng tôi không chắc chắn nếu điều này là bởi vì tôi có hai bản sao của num. Vui lòng giải thích lý do tại sao nó bị lỗi. Cảm ơn bạn.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* getPalin(char* num);
int main()
{
char* num = (char*)malloc(100);
num = "123456";
printf("%s\n", getPalin(num));
return 0;
}
char* getPalin(char* num)
{
int length = strlen(num);
if (length % 2 == 0)
{
char* front = num;
char* end = num + strlen(num) - 1; //pointer to end
while(front != num + (length/2)) //pointers not middle yet
{
*end = *front;
printf("%c", *end);
front++;
end--;
}
}
return num;
}
xin lỗi, không phải sizeof (num), nhưng kích thước của bộ nhớ được phân bổ, tức là 100. I.e. strncpy (num, "123456", 100); – Konstantin
OP yêu cầu giải thích nhưng bạn đã đưa ra một giải pháp. Và không bao giờ quên tự thêm null-terminator sau khi strncpy vì nó không được đảm bảo rằng strncpy thêm nó. Tôi biết nó không có liên quan trong ví dụ này bởi vì "123456" ngắn hơn 100 byte nhưng nếu bạn quyết định sử dụng strncpy hơn là strcpy, hãy sử dụng nó đúng cách - bạn đã tránh được một vấn đề tiềm tàng (tràn bộ đệm) nhưng đã giới thiệu một chuỗi khác (chuỗi chưa hoàn thành) . – qrdl
@qrdl - Miễn là kích thước đích được chỉ định trong strncpy lớn hơn độ dài chuỗi, strncpy sẽ tự động xóa bằng các ký tự null. Chỉ khi kích thước đích được xác định là nhỏ hơn chiều dài chuỗi cần sao chép thì có thể bỏ qua trình kết thúc null. Một piont khác là hãy nhớ rằng strncpy sẽ KHÔNG kiểm tra xem có đủ không gian trong bộ nhớ đích hay không. Vì vậy, tôi cho rằng strncpy (num, "123456", sizeof (num)) sẽ chính xác hơn. – ChrisBD