谁能告诉我下面这段代码为什么有问题?

土著巫师 2012-03-26 11:52:18
从同事处得到一段C语言代码样例,主要是测试一个去除字符串首尾空格和控制符函数的正确性:

#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函数到底有没有问题?对,对在哪?错,错在哪?搞得我两晚没睡好。:(
...全文
213 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 boyla 的回复:]
从同事处得到一段C语言代码样例,主要是测试一个去除字符串首尾空格和控制符函数的正确性:
C/C++ code

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

char *Trim(char *data)
{
if (data && strlen(data)) {

……
[/Quote]


#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][10] = {"", " ", "0", "01234", " 01234", "01234 ", " 01234 "}; // 这样改就可以了

for (i=0;i<7;i++)
{
printf("len = %d, %s\n", strlen(data[i]), Trim(data[i]));
}

return 0;
}


楼主需要注意的问题:
char* a = "1234";
相当于
const char* a = "1234";
即a所指向的内容是不能被修改的。

而char a[10] = "1234";时,a中的元素是可以被修改的。
qiuhui00 2012-03-27
  • 打赏
  • 举报
回复
有问题。Trim函数没有考虑到ASCII码的127也是不可打印字符,main函数更有问题,字符串常量是不可修改的
蓝枫10 2012-03-27
  • 打赏
  • 举报
回复

#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;
}


goldbeef 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 boyla 的回复:]

楼上的各位好:

我是不是可以这样理解,Trim函数本身是没有问题的,而是测试人员的在主函数里的测试用法有问题?
[/Quote]对头
kevin_zlg 2012-03-27
  • 打赏
  • 举报
回复
main函数里char *data[7] = {"", " ", "0", "01234", " 01234", "01234 ", " 01234 "};
是定义7个元素的指针数组,每个元素是一个指针,所以相当于7个指向字符串常量的指针,之后是不能改变常量的值的,可以像上面总结的,用二维数组或动态分配内存,Trim函数没问题
蓝枫10 2012-03-27
  • 打赏
  • 举报
回复
定义二维数组,或申请内存的方法都可以。不过,有点不明白控制符的含义?对于去掉空格的话,函数没有问题···
[Quote=引用 4 楼 boyla 的回复:]

楼上的各位好:

我是不是可以这样理解,Trim函数本身是没有问题的,而是测试人员的在主函数里的测试用法有问题?
[/Quote]
cattycat 2012-03-27
  • 打赏
  • 举报
回复
trim没有问题,你main函数中的字符串必须分配空间,不能是常量字符串。
土著巫师 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qiuhui00 的回复:]

有问题。Trim函数没有考虑到ASCII码的127也是不可打印字符,main函数更有问题,字符串常量是不可修改的
[/Quote]

谢谢,Trim的功能是去除空格和控制字符,不是去除不可打印字符。
土著巫师 2012-03-27
  • 打赏
  • 举报
回复
楼上的各位好:

  我是不是可以这样理解,Trim函数本身是没有问题的,而是测试人员的在主函数里的测试用法有问题?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧