C primer plus (第六版)第十一章 编程练习第10题
题目:
10.编写⼀个函数接受⼀个字符串作为参数,并删除字符串中的空格。在⼀个程序中测试该函数,使⽤循环读取输⼊⾏,直到⽤⼾输⼊⼀⾏空⾏。该程序应该应⽤该函数读取每个输⼊的字符串,并显⽰处理后的结果。
思路:
1. 移除空格函数本质上是用空格后面的字符前移填充掉空格字符,因为空格直接删除后空格位填充什么?填充'\0'字符串在空格处结束?
2. 原书编程练习答案用指针完成相应操作。
3. AI给出的编程答案也是用指针完成相应操作。
4. 同样与之前程序类似,用while()建立循环,不断提示用户输入字符串,运行函数删除字符串中的空格然后输入删除空格后的字符串,直到用户输入空行(回车)退出循环。
程序1:
#include <stdio.h>
#include <string.h>
#define MAXLEN 50
char * s_gets(char * st, int n);
char * space_remove(char * st);
int main()
{char st[MAXLEN];puts("Please enter a string.");while(s_gets(st, MAXLEN) && st[0] != '\n'){space_remove(st);puts(st);puts("Please enter next string or Enter to quit.");}return 0;
}char * space_remove(char * st) //空格移除函数
{int size;int i,j;size = strlen(st); for ( i = 0; i <= size; i++){while (st[i] == ' '){j = i;for (;j <= size; j++){st[j] = st[j+1];}}}
}char * s_gets(char * st, int n) //字符串输入函数
{char * ret_val;char * find;ret_val = fgets(st, n, stdin);if(ret_val){find = strchr(st, '\n');if(find)*find = '\0';elsewhile (getchar() != '\n')continue;}return ret_val;
}
程序2(AI编程答案):
#include <stdio.h>
#define MAX_INPUT_LEN 1000 // 最大输入长度// 函数声明:删除字符串中的所有空格,返回处理后的字符串
void remove_spaces(char *str);
// 辅助函数:安全读取一行输入
char *read_line(char *str, int max_len);int main(void) {char input[MAX_INPUT_LEN];printf("=== 字符串空格删除程序 ===\n");printf("请输入字符串(输入空行结束程序):\n");// 循环读取输入,直到用户输入空行while (1) {printf("> ");// 读取一行输入if (read_line(input, MAX_INPUT_LEN) == NULL) {break; // 读取失败时退出}// 检查是否为空行if (input[0] == '\0') {break;}// 调用函数删除空格remove_spaces(input);// 显示处理后的结果printf("处理后: %s\n", input);}printf("程序结束。\n");return 0;
}// 函数定义:删除字符串中的所有空格
void remove_spaces(char *str) {char *src = str; // 源指针,用于读取字符char *dest = str; // 目标指针,用于写入字符// 遍历整个字符串while (*src != '\0') {// 如果当前字符不是空格,则复制到目标位置if (*src != ' ') {*dest = *src;dest++; // 移动目标指针}src++; // 移动源指针}// 在处理后的字符串末尾添加结束符*dest = '\0';
}// 辅助函数:安全读取一行输入,处理换行符
char *read_line(char *str, int max_len) {char *result = fgets(str, max_len, stdin);if (result != NULL) {// 查找换行符并替换为字符串结束符int i = 0;while (str[i] != '\n' && str[i] != '\0') {i++;}// 替换换行符为结束符if (str[i] == '\n') {str[i] = '\0';} else {// 如果输入过长,清空输入缓冲区while (getchar() != '\n') {continue;}}}return result;
}
程序3(原书编程练习答案):
#include <stdio.h>
#include <string.h> // 需要用到strchr()函数
#define LEN 81
int drop_space(char * s);
char * s_gets(char *st, int n);int main()
{char orig[LEN];puts("Enter a string of 80 characters or less:");while(s_gets(orig, LEN) && orig[0] != '\0'){drop_space(orig);puts(orig);puts("Enter next string (or just Enter to quit):");}puts("Bye!");return 0;
}int drop_space(char * s)
{char * pos;while (*s) //等同于while (*s != '\0'){if (*s == ' '){pos = s;do{*pos = *(pos + 1);pos++;} while (*pos);}elses++;}
}char * s_gets(char * st, int n)
{char * ret_val;char * find;ret_val = fgets(st, n, stdin);if(ret_val){find = strchr(st, '\n');if (find)*find = '\0';elsewhile(getchar() != '\n')continue;}return ret_val;
}