谁能告诉我下面这段代码为什么有问题?
从同事处得到一段C语言代码样例,主要是测试一个去除字符串首尾空格和控制符函数的正确性:
- C/C++ code
#include <string.h>#include <stdlib.h>#include <stdio.h>char *Trim(char *data){ if (data && strlen(data)) { int begin = 0; int end = strlen(data) - 1; while (begin <= end && data[begin] <= ' ') ++begin; if (begin > end) data[0] = '\0'; else{ while (data[end] <= ' ') --end; memmove(data, data + begin, end - begin + 1); data[end - begin + 1] = '\0'; } } return data;}int main(int argc, char* argv[]){ int i; char *data[7] = {"", " ", "0", "01234", " 01234", "01234 ", " 01234 "}; for (i=0;i<7;i++) { printf("len = %d, %s\n", strlen(data[i]), Trim(data[i])); } return 0;}请问上面的Trim函数到底有没有问题?对,对在哪?错,错在哪?搞得我两晚没睡好。:(
[解决办法]
- C/C++ code
#include <string.h>#include <stdlib.h>#include <stdio.h>char *Trim(char *data){ if (data && strlen(data)) { int begin = 0; int end = strlen(data) - 1; while (begin <= end && data[begin] <= ' ') ++begin; if (begin > end) data[0] = '\0'; //修改了常量字符串的值,肯定会导致程序出错··· else{ while (data[end] <= ' ') --end; memmove(data, data + begin, end - begin + 1); data[end - begin + 1] = '\0'; } } return data;}int main(int argc, char* argv[]){ int i; char *data[7] = {"", " ", "0", "01234", " 01234", "01234 ", " 01234 "}; for (i=0;i<7;i++) { printf("len = %d, %s\n", strlen(data[i]), Trim(data[i])); } return 0;}
[解决办法]
有问题。Trim函数没有考虑到ASCII码的127也是不可打印字符,main函数更有问题,字符串常量是不可修改的
[解决办法]
[解决办法]
trim没有问题,你main函数中的字符串必须分配空间,不能是常量字符串。
[解决办法]
定义二维数组,或申请内存的方法都可以。不过,有点不明白控制符的含义?对于去掉空格的话,函数没有问题···
[解决办法]
main函数里char *data[7] = {"", " ", "0", "01234", " 01234", "01234 ", " 01234 "};
是定义7个元素的指针数组,每个元素是一个指针,所以相当于7个指向字符串常量的指针,之后是不能改变常量的值的,可以像上面总结的,用二维数组或动态分配内存,Trim函数没问题
[解决办法]