对于输入的字符串,去掉该字符串首尾的空格后输出;下列代码有何问题#include <iostream> using namespace std; char* trim(char* str); int main() { char s[1024]; cin.getline(s, 1024); cout << trim(s) << endl; return 0; } char* trim(char* str) { int len; len = strlen(str); int k = 0; for (int i = 0; i < len; i++) { if (str[i] !=' ') { k = k + 1; } } char* a; a = new char[k]; int m = 0; while (m < k) { for (int j = 0; j < len; j++) { if (str[j] != ' ') { a[m] = str[j]; m++; } } } return a; }
时间: 2024-02-14 08:12:47 浏览: 56
这段代码有几个问题:
1. 函数 `trim` 没有处理字符串首尾的空格,而是将所有空格都去掉了;
2. 函数 `trim` 动态申请了内存,但没有释放,容易造成内存泄漏;
3. 函数 `trim` 返回的是一个指针,但指向的内存空间是动态申请的,可能会在函数结束后被释放掉,导致指针无效。
以下是修正后的代码:
#include <iostream>
#include <cstring>
using namespace std;
char* trim(char* str);
int main() {
char s[1024];
cin.getline(s, 1024);
char* result = trim(s);
cout << result << endl;
delete[] result;
return 0;
}
char* trim(char* str) {
int len = strlen(str);
int start = 0, end = len - 1;
while (start < len && str[start] == ' ') {
start++;
}
while (end >= 0 && str[end] == ' ') {
end--;
}
int newLen = end - start + 1;
char* result = new char[newLen + 1];
strncpy(result, str + start, newLen);
result[newLen] = '\0';
return result;
}
修正后的代码使用了两个指针 `start` 和 `end` 来确定字符串的首尾位置,然后使用 `strncpy` 函数将有效部分复制到新的内存空间中,最后在字符串末尾添加了一个空字符。在 `main` 函数中,使用 `delete[]` 释放了动态申请的内存空间,避免了内存泄漏。
阅读全文