我是C的新手,我正在尝试学习如何使用字符串并使用函数打印它。我在使用while(ch = getchar(), ch >= 0)
的所有地方看到了示例,但是只要我将它放入函数(而不是main()),它就会停止工作。现在,它陷入无休止的循环......为什么会这样?
// from main():
// printString("hello");
void printString(char *ch)
{
while (*ch = getchar(), *ch >= 0)
putchar(*ch);
}
答案 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)
这里会发生以下情况:
main
中,使用指向字符串“hello”的指针调用printString
printString
函数尝试使用getchar()
语言规则说试图改变'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);
}
有很多东西:
ch
指向的第一个字符(如果你传入一个字符串文字,这甚至可能不起作用。答案 3 :(得分:0)
我会printf("%s",str);
或puts(str);