问一个关于 C 语言的问题

Canglin · 2024-11-9 13:42:04 · 12 次点击

现在再看 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 半天,它也答不出来个所以然,大概就是因为所以自有道理的回答

举报· 12 次点击
登录 注册 站外分享
快来抢沙发
0 条回复  
返回顶部