【发布时间】:2015-10-14 09:13:29
【问题描述】:
我一直在阅读一些关于 C 的书籍,试图让我的 C 腿(海腿!明白吗?!)。我刚刚完成了 K&R 书中的练习 1-9,作为参考,该练习是“编写一个程序将其输入复制到其输出,将一个或多个空格的每个字符串替换为一个空格”。不过,我对我的代码发生了什么有疑问--
#include <stdio.h>
//Copy input to output. Replace each string of multiple spaces with one single space
int main(int argc, char *argv[]){
int ch, lch; // Variables to hold the current and last characters, respectively
/* This loop should 'put' the current char, then store the current char in lc,
* loop back, 'get' a new char and check if current and previous chars are both spaces.
* If both are spaces, do nothing. Otherwise, 'put' the current char
*/
for(ch = getchar(); (ch = getchar()) != EOF; lch = ch){
if(ch == ' ' && lch == ' ')
;
else putchar(ch);
}
return 0;
}
这主要是有效的,除了第一个字符输入。例如,如果第一行输入是
"This is a test"
我的代码输出
"his is a test".
删除第一个字符输入后,该程序始终如一地工作以满足练习的要求。
有人可以告诉我我在循环中犯的导致问题的错误吗?也欢迎任何其他建议。
【问题讨论】:
-
注意,您在循环体中使用了
lch变量,即使它在第一次循环迭代之后 之前未初始化。考虑在你的编译器中启用警告,它可能会检测到这个问题并发出警告,所以你可以修复它。 -
次要编码风格注释:保存
for()用于将某些索引/指针增加固定量的循环。此处调用了while()循环。 -
建议最好更明确地提及“K&R 书”所指的内容是否真的很烦人,而且问题标题如果能明确说明某些方面会更好问题指的是(在直接意义上 - 因为问题在很大程度上独立于其来源,并且知道 C 并且可以提供一个很好的答案但没有听说过“K&R 书”的人可能会跳过这个问题)?
-
@chux - 这不是
for的用途。它用于具有初始化部分、条件部分和后迭代部分的循环。立即想到使用迭代器。据我所知,他使用for没有任何问题。 -
@jfhc 建议去哪里找一个没听过传统标准书的C程序员?如果他们确实存在,他们就不可能在正确的历史背景下判断这个问题。