山科大 oj 编写函数:清除字符串首尾的空白符 (Append Code)

来源:互联网 发布:c语言malloc头文件 编辑:程序博客网 时间:2024/04/28 04:49

Description

在C语言中,将ASCII字符集中的制表符('\t')、回车符('\r')、换行符('\n')、垂直制表符('\v')、换页符('\f')和空格字符(' ')称作空白符。你的任务是读入每行字符串,去掉行首和行尾的连续空白符,但是在任意非空白符中间的空白符不要去除。

-----------------------------------------------------------------------------

编写一个函数trim(),把一个串首尾的空白符清除掉:

原型:char * trim(char *s);

功能:去掉字符串s首尾的连续空白符,s中在任意非空白符中间的空白符不要去除,并将s的首地址返回。

函数的调用格式见“Append Code”。

Input

输入为多行,每行为一个串(不超过100个字符),至某行输入的非空白符仅为“END”结束。

Output

输出为多行,为每行输入的去掉前后空白符的串。“END”也输出。

Sample Input

 abcdefg    12345678XYZabc 123   END 

Sample Output

abcdefg12345678XYZabc 123END

HINT

下面这些说法都是一个意思:“返回一个字符串S”、“返回字符串S的指针”、“返回字符串S的首地址”。


心路历程:这个题真是把我给坑苦了,这个题我使用的是isspace来判断是否为空字符,isspace的定义如下:

检查参数c是否为空格字符,也就是判断是否为空格(' ')、水平定位字符('\t')、归位键('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')的情况返回值若参数c为空格字符,则返回TRUE,否则返回NULL(0)。
我上来就自作主张的的吧true当作1来判断了,但是悲剧的是我的电脑的返回值它就是1,但是oj系统和他人电脑上的情况返回值都是其他的正数,这一个问题困扰了我一天之久,最后终于发现了问题。
其实这个题思路并不难想,从前面找到不为空字符第一个,也找到不为空字符的最后一个,并把结尾定义为'\0',然后将这个函数前后覆盖,得到的新字符串就是我们要得到的字符串。
#include<stdio.h>#include<string.h>#include<ctype.h>#define MAX_STR_LEN 110 char * trim(char *s){    int i, j, k;    int len = strlen(s);    for(i = 0; isspace(s[i]) > 0; i++);    for(j = len - 1; isspace(s[j]) > 0; j--);    //printf("%d %d\n", i, j);    s[j + 1] = '\0';    for(k = 0; s[k + i] != '\0'; k++)        s[k] = s[k + i];    s[k] = '\0';    return s;} int main(){    char str[MAX_STR_LEN], *p;    do    {        gets(str);        p = trim(str);        puts(p);    } while(strcmp(p, "END"));    return 0;}

其实这个题目我还用了另外一种方法,但是不知道这样做到底是否正确,如有不妥,还请指出。用&s[i]来取地址。
#include<stdio.h>#include<string.h>#include<ctype.h>#define MAX_STR_LEN 110 char * trim(char *s){    int i, j;    int len = strlen(s);    for(i = 0; isspace(s[i]) > 0; i++);    for(j = len - 1; isspace(s[j]) > 0; j--);    s[j + 1] = '\0';    return &s[i];} int main(){    char str[MAX_STR_LEN], *p;    do    {        gets(str);        p = trim(str);        puts(p);    } while(strcmp(p, "END"));    return 0;}



0 0
原创粉丝点击