《C Prime Plus》编程练习11_3题目分析

133 阅读2分钟

题目

设计并测试一个函数,从一行输入中把一个单词读入一个数组中并丢弃输入行中其他字符,要跳过第一个非空白字符前面的所有空白,并将单词定义为没有空白符的字符序列。

题目分析

题目难点: 这道题需要有对指针较强的理解,用户输入的内容可能会含有很多空白符,而最后要记录下来的完全不需要空白符的字符串,那么就需要指针来操作,指针指向用户输入的有效内容,然后把值传递给后面要打印出来的存储有效内容的字符串。

程序结构: 头文件一堆,其中包括书中的一个自定义输入函数的头文件,一个字面常量(限定字符串长度),处理用户输入的功能函数原型,主函数,函数定义;

功能函数解析: 一个返回值为整数的函数,返回值用于主函数判断是否为有效输入,返回0时,说明用户没有输入有效内容。 函数内有一个字符串,用于存储用户输入的全部内容,函数的参数是真正存储有效内容的字符串,用一个函数内的指针来实现函数内外字符串的通讯。

代码展示

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "sgets.h"

#define LEN 10

int getword(char *);

int main(void) {
    char word[LEN];
    puts("Enter a word:");
    while (getword(word) != 0) {
        puts("Your input is:");
        puts(word);
        puts("You could enter another word:");
    }
    puts("Done!");
    return 0;
}

int getword(char *str) {
    char temp[LEN];
    int n = 0; //记录有效内容的长度,如果最后这个数依然是0,就说明功能函数没有获取到有效内容
    s_gets(temp, LEN);
    char *ptr = temp;
    for (int i = 0; i < strlen(temp); ++i) { //对全内容字符串进行遍历
        if (isspace(ptr[i]) && ptr[i] != '\0') {
            ptr++;  //遇到空白符时,就不把此位置的值传递给参数的数组,也不对有效内容长度n进行计数
        } else if (!isspace(ptr[i]) && ptr[i] != '\0') {
            str[n] = ptr[i]; //如果遍历到非空白符,就把这个值传递给参数数组
            n++; //有效内容计时器也进行递增
        }
    }
    str[n] = '\0';
    return n;
}