The C Programming Language 1-9

练习1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。

这个问题其实考虑起来有个思维过程。先看一个例子
I have a blank I  have  two  I   have   three
这里理所当然要使用到getchar()函数来处理,所以要有字符流的思维,因此上面的字符串可以归为三种情况:(每次getchar()返回一个字符)
1,返回的是字母,则直接另输出的就是字符本身即可
2,返回的是空格,且该空格的前一个字符是字母,则另该空格为其本身即可
3,返回的是空格,但该空格的前一个字符也是空格(也就是体重所谓的“多个空格”),则将其替换为”
上面的三种情况可以由三个if语句来构成,但是这样写过于麻烦。不妨回头看一下三个情况,似乎可以合并成两个。的确,情况一和情况二所作的处理都是相同的,即另输出为输入,因此这里可以用一个if-else语句来简化。考虑到情况3较容易陈述,故将其放入if中,其余情况用else代替,可缩短整片语句。

#include <stdio.h>

main()
{
int n = 0;
int str[n] = getchar();

while (n = 0;str[n] != EOF;n++)
    if(str[n] == ‘ ‘ || str[n – 1] == ‘ ‘)
        str[n] = ”;
    else
        str[n] = str[n];
    putchar(str[n]);
}

——————————————-
但是这条程序还是有问题,编译器检测到数组的初始化有问题(
int str[n] = getchar();这部分有问题),可是我查阅了数组初始化的资料发现似乎没错啊~真不知道为什么了。先放着,以后想到再回头看看。
同时这条程序还有一个隐藏的危险,就是利用数组来存储getchar()返回的内容可能会放不下,而出现错误。这个我记得似乎有解决方法的~不过暂时想不出来了,想到了再回头重新弄弄尴尬


以下是姬失准的参考程序

The C Programming Language 1-9

其中方法一和我的思路相同,但似乎他用了stdlib.h中的lastc,这个啥玩意我不知道Confused 以后研究stdlib.h了再回头看看,似乎他那条很简洁的。
方法二的话实在是看不懂了。Sarcastic

2 thoughts on “The C Programming Language 1-9

  1. 数组没有合法的初始化..假设你开始int n = 0;int str[n] = getchar();那么其实就是int str[0] = getchar();那之前数组又是多大呢, 空间占用了多少?可以尝试改成:int n = 0;int str[255];str[n] = getchar();

Leave a comment