现在再看 Cprimerplus ,第 11 章的练习 3 题目是:
设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并丢弃输入行中的其余字符。该函数应该跳过第 1 个非空白字符前面的所有空白。将一个单词定义为没有空白、制表符或换行符的字符序列。
我写了一版:
#define LIM 81
#include <ctype.h>
#include <stdio.h>
void getnchar(char *str);
void test11_13_03()
{
char str[LIM];
puts("Please Enter your String:");
getnchar(str);
printf("This String is :-----%s\n", str);
}
void getnchar(char *str)
{
int c, index = 0;
while ((c = getchar()) != EOF && isspace(c))
{
}
while (!isspace(c))
{
str[index++] = c;
c = getchar();
}
str[index] = '\0';
}
然后我从 ChatGPT 问了一下,它是这么做的:
#include <stdio.h>
#include <ctype.h>
#define LEN 10
char *getword(char *str);
int main() {
char word[LEN];
printf("Please enter a word (EOF to quit):\n");
while (getword(word) != NULL) {
printf("Result: %s\n", word);
printf("You can enter a word again (EOF to quit):\n");
}
printf("Done.\n");
return 0;
}
char *getword(char *str) {
int ch, n = 0;
char *pt = str;
while ((ch = getchar()) != EOF && isspace(ch)) {
}
if (ch == EOF) {
return NULL;
}
*str++ = ch;
n++;
while ((ch = getchar()) != EOF && !isspace(ch) && n < LEN - 1) {
*str++ = ch;
n++;
}
*str = '\0';
if (ch != EOF) {
while (getchar() != '\n') {
}
}
return ch == EOF ? NULL : pt;
}
这段代码中
if (ch == EOF) {
return NULL;
}
*str++ = ch;
n++;
while ((ch = getchar()) != EOF && !isspace(ch) && n < LEN - 1) {
我没看明白这咕噜:
*str++ = ch;
n++;
为啥 str 不在 while 循环中,但是可以持续自增而不是自增 1 次就结束了
为了 GPT 半天,它也答不出来个所以然,大概就是因为所以自有道理的回答
|