鱼C论坛

 找回密码
 立即注册
查看: 101|回复: 3

关于指针自增的问题

[复制链接]
发表于 2024-11-9 14:12:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
现在再看 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 半天,它也答不出来个所以然,大概就是因为所以自有道理的回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-9 14:12:27 | 显示全部楼层
让我们来详细解释一下这段代码中的 `*str++ = ch;` 以及它为什么可以连续自增的问题。

### 代码解释

在这段代码中:
*str++ = ch;

这里有两部分要理解:

1. `*str = ch;`:将当前字符 `ch` 存储在指针 `str` 所指向的内存位置,也就是把 `ch` 赋给了 `str` 所指的位置。

2. `str++`:自增指针 `str`,使其指向下一个内存位置。

### 工作机制

**第一次赋值并自增:**

- `*str = ch;`:假设 `str` 指向一个数组的起始位置,比如位置 0,这个语句把 `ch` 的值放在数组的第一个位置。
- `str++`:把指针 `str` 移到下一个位置,比如位置 1。

这样在 `if (ch == EOF)` 之后的代码,已经对 `*str = ch` 完成了第一次赋值和自增。

**循环中的行为:**

在循环中:
while ((ch = getchar()) != EOF && !isspace(ch) && n < LEN - 1) {
    *str++ = ch;
    n++;
}

- 在循环中,每执行一次 `*str++ = ch;` 都是相同的逻辑,它把当前字符 `ch` 存储在当前指针 `str` 指向的位置,然后自增 `str`,以便下一次迭代时存储下一个字符到数组的下一个位置。

- 每次循环,使指针 `str` 移动到下一个存储位置,并通过 `n++` 记录已经存储的字符数。

### 结论

所以,尽管 `*str++ = ch;` 不在循环条件中,它在每次循环体执行的时候都会执行。这就是为什么它可以持续自增,并在数组中存储连续字符。

如果还有不明白的地方,可以结合打印每次 `str` 的地址和计算的位置观察指针是如何移动的,这样有助于理解指针的自增过程。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-9 15:54:04 | 显示全部楼层
本帖最后由 jackz007 于 2024-11-9 16:02 编辑

            ChatGPT 给出的代码是不是过于繁琐?
            请试试下面这个代码如何:
#include <stdio.h>

char * getword(char s[])
{
        int c , k                                              ;
        for(k = 0 ; s[k] && (s[k] == ' ' || s[k] == 9) ; k ++) ;
        for(c = 0 ; s[k + c] && s[k + c] != ' ' && s[k + c] != 9 && s[k + c] != '\n' ; c ++) {
                if(k) s[c] = s[k + c]                          ; 
        }
        s[c] = 0                                               ;
        return s                                               ;
}

int main(void)
{
        char s[256]                                            ;
        fgets(s , 256 , stdin)                                 ;
        printf("%s\n" , getword(s))                            ;
        return 0                                               ;
}
        编译、运行实况:
D:\[exercise]\C>g++ -o x x.c

D:\[exercise]\C>x
                                        fishC is my site.
fishC

D:\[exercise]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-10 20:39:30 | 显示全部楼层
jackz007 发表于 2024-11-9 15:54
ChatGPT 给出的代码是不是过于繁琐?
            请试试下面这个代码如何:

感谢您的回复
研究了半天,第一次知道了for中还可以增加这样的判断,学习了,之前一直只会类似i<LIM这样的判断
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表