【发布时间】:2014-07-25 22:40:16
【问题描述】:
只是从我的教科书中查看一个词频计数程序,我有 理解几个片段有点麻烦。
我得到了函数的一般要点,我们从标准输入得到一个词并返回 如果我们找到一个单词,则为 1,否则为 0。
现在,if (strchr(wordChars,ch)) break; 这行只是说,“如果我们
从 stdin 中抓取的是我们要打破循环的字母表的一部分?
接下来,*c++ = ch;这行让我很困惑,这是设置第一个字符吗
到字符串的第二个元素?为什么要这样做?
while ((ch = getchar()) != EOF) {
ch = tolower(ch);
if (!strchr(wordChars,ch)) break;
*c++ = ch;
这是函数的核心,是吗?我们在哪里形成实际的单词。还,
if (c == buf) return 0;我假设这条线是在什么都没有或
读取非字母输入。
这里的语法很混乱,\'是一个字符吗?在我看来,这 字符串的元素尚未初始化。如果我们离开那个, 代码的其余部分是我们将单词移回一个元素的地方,这个 对我来说真的没有意义。
if (buf[0] == '\'') {
for (c = buf+1; *c != '\0'; c++)
*(c-1) = *c;
*(c-1) = '\0';
}
接下来,这不是访问和替换吗 单词的最后一个字母?这对我来说很有意义 如果 strlen 包含空字符,但不正确?
n = strlen(buf)-1;
我想我真正想从中得到的就是“\”要传达的意思。
感谢您的帮助!**
int getWord(char *buf){
int ch, n;
char *c = buf;
const char *wordChars = "abcdefghijklmnopqrstuvwxyz'";
while ((ch = getchar()) != EOF) {
ch = tolower(ch);
if (strchr(wordChars,ch)) break;
}
if (ch == EOF) return 0;
*c++ = ch;
while ((ch = getchar()) != EOF) {
ch = tolower(ch);
if (!strchr(wordChars,ch)) break;
*c++ = ch;
}
*c = '\0';
if (c == buf) return 0;
if (buf[0] == '\'') {
for (c = buf+1; *c != '\0'; c++)
*(c-1) = *c;
*(c-1) = '\0';
}
n = strlen(buf)-1;
if (buf[n] == '\'') {
buf[n] = '\0';
}
else if (buf[n-1] == '\'' && buf[n] == 's') {
buf[n-1] = '\0';
}
return 1;
}
【问题讨论】:
-
'\''表示单引号。 \ 符号的意思是“后面的字符不是字面上的那个字符,而是具有特殊含义”。在这种情况下,特殊含义是因为'通常表示字符常量的结尾,即''将是一个错误。 \ 表示以下'是分隔符内的内容,而不是分隔符本身。 -
后缀
++返回变量的原始值,因此*c++ = ch;这行实际上等价于:*c = ch; c += 1;