#include<stdio.h> #include<string.h> #include<stdlib.h> char* reverse(char *s) { int i=strlen(s); int j= i; char *ptr=(char*)malloc(strlen(s)*sizeof(char)); memset(ptr, 0, strlen(s)*sizeof(char)); i--; for(;i>=0 ;i-- ){ ptr[i] = *s; s++; } ptr[j] = '\0'; s=ptr; return s; } int main(){ char *str=(char*)malloc( 200*sizeof(char) ); scanf("%s", str); str = reverse(str); printf("%s", str); return 0; } 优化这代码使其代码量短小性能更好
时间: 2024-02-06 14:02:59 浏览: 157
可以直接在原字符串上进行反转,避免使用额外的空间。同时可以使用两个指针,一个指向字符串的开头,一个指向结尾,交换它们所指向的字符即可。
优化后的代码如下:
```c
#include <stdio.h>
#include <string.h>
char* reverse(char* s) {
int len = strlen(s);
for (int i = 0, j = len - 1; i < j; i++, j--) {
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
return s;
}
int main() {
char str[200];
scanf("%s", str);
printf("%s", reverse(str));
return 0;
}
```
这样代码量更小,性能也更好。
相关问题
#include<stdio.h> #include<string.h> #include<stdlib.h> char* reverse(char *s) { int i=strlen(s); int j= i; char *ptr=(char*)malloc(strlen(s)*sizeof(char)); memset(ptr, 0, strlen(s)*sizeof(char)); i--; for(;i>=0 ;i-- ){ ptr[i] = *s; s++; } ptr[j] = '\0'; s=ptr; return s; } int main(){ char *str=(char*)malloc( 200*sizeof(char) ); scanf("%s", str); str = reverse(str); printf("%s", str); return 0; } 修改这个代码让这个代码变得很复杂,难以读懂
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* reverse(char* s) {
int i = strlen(s);
int j = i;
char* ptr = (char*)malloc(strlen(s) * sizeof(char));
memset(ptr, 0, strlen(s) * sizeof(char));
i--;
for (; i >= 0; i--) {
ptr[i] = *s;
s++;
}
ptr[j] = '\0';
s = ptr;
return s;
}
void* obfuscate(void* ptr) {
int* p = (int*)ptr;
*p = (*p ^ 0xdeadbeef) + 0x1337;
return ptr;
}
int main() {
char* str = (char*)malloc(200 * sizeof(char));
printf("Enter a string: ");
scanf("%s", str);
str = (char*)obfuscate((void*)reverse(obfuscate((void*)str))));
printf("Reversed string: %s\n", str);
free(str);
return 0;
}
修改:#include <stdio.h> #include <string.h> #include <stdlib.h> void reverse(char *str) { int len = strlen(str); char *start = str; char *end = str + len - 1; char temp; while(start < end) { temp = *start; *start = *end; *end = temp; start++; end--; } } int main() { char a[100]; printf("输入句子"); gets(a); puts(a); reverse(a); printf("反转后是:%s",a); }
这段代码存在一些问题,gets函数已经被弃用,应该改用fgets或者scanf等安全的输入函数。此外,在输入字符串时没有限制长度,可能会导致缓冲区溢出。另外,reverse函数没有对空字符串进行处理,可能会导致程序崩溃。以下是修正后的代码:
```
#include <stdio.h>
#include <string.h>
void reverse(char *str) {
if (str == NULL || *str == '\0') { // 处理空字符串
return;
}
int len = strlen(str);
char *start = str;
char *end = str + len - 1;
char temp;
while (start < end) {
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
int main() {
char a[100];
printf("输入句子:");
fgets(a, sizeof(a), stdin); // 使用fgets函数读取输入
printf("原始字符串是:%s", a);
reverse(a);
printf("反转后是:%s", a);
return 0;
}
```
阅读全文