使用函数在C中打印字符串

时间:2010-09-25 16:46:04

标签: c string char getchar putchar

我是C的新手,我正在尝试学习如何使用字符串并使用函数打印它。我在使用while(ch = getchar(), ch >= 0)的所有地方看到了示例,但是只要我将它放入函数(而不是main()),它就会停止工作。现在,它陷入无休止的循环......为什么会这样?

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

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

4 个答案:

答案 0 :(得分:3)

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

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

while (*ch != '\0')

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

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

while (*ch != '\0') {
    putchar(*ch);
    ch++;
}

答案 1 :(得分:3)

这里会发生以下情况:

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

    语言规则说试图改变'h'是未定义的行为。如果你很幸运,你的程序会崩溃;如果你很不走运,那么程序就会运行。

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

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

        hello
        ^            ch is a pointer
        ch           *ch is 'h' -- ch points to an 'h'
    

    在最后一个'o'之后有什么东西吗? 有!{/ strong> A '\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. */
        }
    }
    

答案 2 :(得分:2)

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

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

您原来的功能:

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

有很多东西:

  1. 从stdin中读取字符
  2. 存储从stdin读取的字符 到ch指向的第一个字符(如果你传入一个字符串文字,这甚至可能不起作用。
  3. 将字符写入stdout。
  4. 当读取的字符是< 0(这在某些平台上不起作用。由于结果存储在char中,你无法区分EOF和有效字符.ch应该是一个int,因为getchar()返回一个int,所以你可以检查EOF )

答案 3 :(得分:0)

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