Cuối cùng, nó sẽ sạch hơn để đảo ngược nó tại chỗ, như vậy:
#include <stdio.h>
#include <string.h>
void
reverse(char *s)
{
int a, b, c;
for (b = 0, c = strlen(s) - 1; b < c; b++, c--) {
a = s[b];
s[b] = s[c];
s[c] = a;
}
return;
}
int main(void)
{
char string[] = "hello";
printf("%s\n", string);
reverse(string);
printf("%s\n", string);
return 0;
}
giải pháp của bạn về bản chất là một phiên bản ngữ nghĩa lớn hơn thế này. Hiểu sự khác biệt giữa một con trỏ và một mảng. Các tiêu chuẩn một cách rõ ràng nói rằng behviour của một hoạt động (sửa đổi các nội dung của một chuỗi chữ) là không xác định. Bạn cũng sẽ thấy this đoạn trích từ eskimo:
Khi bạn khởi tạo một mảng ký tự với một chuỗi liên tục:
char string[] = "Hello, world!";
bạn kết thúc với một mảng chứa các chuỗi, và bạn có thể sửa đổi nội dung của mảng để bạn nội dung của trái tim:
string[0] = 'J';
Tuy nhiên, có thể sử dụng hằng số chuỗi (cụm từ chính thức là chuỗi ký tự) tại các vị trí khác trong mã của bạn. Vì chúng là các mảng, trình biên dịch tạo ra các con trỏ tới các phần tử đầu tiên của chúng khi chúng được sử dụng trong các biểu thức, như thường lệ. Nghĩa là, nếu bạn nói
char *p1 = "Hello";
int len = strlen("world");
nó gần như là nếu bạn muốn nói
char internal_string_1[] = "Hello";
char internal_string_2[] = "world";
char *p1 = &internal_string_1[0];
int len = strlen(&internal_string_2[0]);
Ở đây, các mảng tên internal_string_1 và internal_string_2 có nghĩa vụ phải đề nghị thực tế là trình biên dịch thực sự tạo ra ít tạm thời mảng mỗi khi bạn sử dụng một hằng số chuỗi trong mã của bạn. Tuy nhiên, thực tế tinh tế là các mảng có `` đằng sau '' các hằng số chuỗi không nhất thiết phải có thể sửa đổi được. Đặc biệt, trình biên dịch có thể lưu trữ chúng trong bộ nhớ chỉ đọc. Do đó, nếu bạn viết
char *p3 = "Hello, world!";
p3[0] = 'J';
chương trình của bạn có thể gặp sự cố, vì nó có thể cố gắng lưu giá trị (trong trường hợp này là ký tự 'J') vào bộ nhớ không thể ghi.
Đạo đức là bất cứ khi nào bạn xây dựng hoặc sửa đổi chuỗi, bạn phải đảm bảo rằng bộ nhớ bạn đang xây dựng hoặc sửa đổi chúng có thể ghi được.Bộ nhớ đó hoặc là một mảng mà bạn đã cấp phát hoặc một số bộ nhớ mà bạn đã phân bổ động bằng các kỹ thuật mà chúng ta sẽ thấy trong chương tiếp theo. Hãy chắc chắn rằng không có phần nào của chương trình của bạn sẽ cố gắng sửa đổi một chuỗi mà thực sự là một trong những mảng không tên, không có khả năng mà trình biên dịch tạo ra cho bạn để đáp ứng với một trong các hằng số chuỗi của bạn. (Ngoại lệ duy nhất là khởi tạo mảng, vì nếu bạn ghi vào mảng như vậy, bạn đang ghi vào mảng đó, không phải bằng chuỗi ký tự mà bạn đã sử dụng để khởi tạo mảng.) "
Mặc dù mọi người trả lời câu hỏi của bạn figured it out, bạn không bao giờ biết những gì lỗi bạn đã nhận được, hoặc những gì đã không làm việc! Bạn nên luôn luôn mô tả những gì bạn mong đợi, và những gì bạn thực sự nhìn thấy. (Đầu ra không chính xác? Seg-lỗi/GPF lỗi? Loop vô hạn/hang?) – abelenky
Đó là một segfault. Tôi nên đề cập đến nó, cảm ơn bạn đã nhắc nhở. – qwer