0

我是 C 的新手,正在尝试学习如何获取字符串并使用函数打印它。我到处都看到使用 的示例while(ch = getchar(), ch >= 0),但是一旦我将它放入一个函数(而不是 main()),它就停止工作了。现在,它陷入了无限循环……这是为什么呢?

// from main():
// printString("hello");

void printString(char *ch)
{
    while (*ch = getchar(), *ch >= 0)
    putchar(*ch);
}
4

4 回答 4

3

getchar()从标准输入读取用户输入。如果要打印传入的字符串,则不需要getchar().

让我们一步一步来。您的循环每次从标准输入读取一个字符,直到它到达文件结尾。这就是ch >= 0测试检查的内容:只要我们得到有效字符,就继续阅读。对于打印字符串的字符,条件会发生变化。现在一个有效的字符是任何不是 NUL ( '\0') 的东西。所以我们将循环条件更改为:

while (*ch != '\0')

接下来是找出循环体。putchar(*ch)很好;我们会把它留在那里。但是如果没有,getchar()我们必须弄清楚“获取下一个字符”的等效语句是什么。

那将是ch++。这会将ch指针推进到字符串中的下一个字符。如果我们把它放在循环的末尾,那么我们将打印一个字符,前进一个空格,然后检查下一个字符是否为非 NUL。如果是,那么我们将其打印、推进并检查。

while (*ch != '\0') {
    putchar(*ch);
    ch++;
}
于 2010-09-25T16:57:44.973 回答
3

这里发生的情况如下:

  1. 在您使用指向字符串“hello”的指针main调用的函数中printString
  2. printString函数尝试读取一个字符getchar()
  3. 并将该字符保存在“h”的位置

该语言的规则说,试图改变“h”是未定义的行为。如果你幸运的话,你的程序会崩溃;如果你很不走运,它会显示该程序有效。

简而言之:getchar()用于阅读;putchar()用于书写。

你想写 5 个字母:'h'、'e'、'l'、'o' 和另一个 'o'。

    你好
    ^ ch 是一个指针
    ch *ch is 'h' -- ch 指向一个 'h'

在最后一个“o”之后有什么东西吗?有!一个'\0'。零字节终止字符串。所以试试这个(用printString("hello");)......

void printString(char *ch)
{
    putchar(*ch); /* print 'h' */
    ch = ch + 1;  /* point to the next letter. */
                  /* Note we're changing the pointer, */
                  /* not what it points to: ch now points to the 'e' */
    putchar(*ch); /* print 'e' */
    ch = ch + 1;  /* point to the next letter. */
    putchar(*ch); /* print 'l' */
    ch = ch + 1;  /* point to the next letter. */
    putchar(*ch); /* print 'l' */
    ch = ch + 1;  /* point to the next letter. */
    putchar(*ch); /* print 'o' */
    ch = ch + 1;  /* point to the next letter. What next letter? The '\0'! */
}

或者您可以在循环中编写它(并使用不同的参数从 main 调用)...

void printString(char *ch)
{
    while (*ch != '\0')
    {
        putchar(*ch); /* print letter */
        ch = ch + 1;  /* point to the next letter. */
    }
}
于 2010-09-25T17:09:42.323 回答
2

根据您的描述,您只需要:

void printString(char *ch)
{
  while(*ch) {
     putchar(*ch);
     ch++;
  }
}

你原来的功能:

void printString(char *ch)
{
    while (*ch = getchar(), *ch >= 0)
    putchar(*ch);
}

做了很多事情:

  1. 从标准输入读取字符
  2. 将从标准输入读取的字符存储到指向的第一个字符中ch(如果您传入字符串文字,这甚至可能不起作用。
  3. 将字符写入标准输出。
  4. 当读取的字符 < 0 时终止(这在某些平台上不起作用。由于结果存储在 char 中,因此您无法区分 EOF 和有效字符。ch 应该是一个 int,因为 getchar() 返回一个int 所以你可以检查EOF)
于 2010-09-25T16:55:33.640 回答
0

我会做printf("%s",str);puts(str);

于 2010-09-25T16:53:21.150 回答