来自“Dennis Ritchie 的 C 编程语言”的这个程序中的“++argv”如何正确?

Posted

技术标签:

【中文标题】来自“Dennis Ritchie 的 C 编程语言”的这个程序中的“++argv”如何正确?【英文标题】:How is "++argv" correct in this program from "The C programming Language by Dennis Ritchie"? 【发布时间】:2020-05-19 15:35:17 【问题描述】:

main函数的第二个参数为char * argv[],这是一个指针数组。在同一本书中已经提到我们不能使用像“++”这样的操作关于数组名称。但是,在这里我们可以看到 ++argv 已经被使用了。

#include <stdio.h>
#include <string.h>

#define MAXLINE 1000

int getline(char* line, int max);


/* find: print lines that match pattern from 1st arg */
int main(int argc, char* argv[]) 

    char line[MAXLINE];
    long lineno = 0;
    int c, except = 0, number = 0, found = 0;

    while (--argc > 0 && (*++argv)[0] == '-')
    
        while (c = *++argv[0])
        
            switch (c) 
            
                case 'x': 
                    except = 1;
                
                    break;

                case 'n': 
                    number = 1;
                
                    break;

                default: 
                    printf("find: illegal option %c\n", c);
                    argc = 0;
                    found = -1;
                
                    break;
            
        
    

    if (argc != 1)
    
        printf("Usage: find -x -n pattern\n");
    
    else
    
        while (getline(line, MAXLINE) > 0) 
        
            lineno++;

            if ((strstr(line, *argv) != NULL) != except) 
            
                if (number)
                
                    printf("%ld:", lineno);
                

                printf("%s", line);
                found++;
            
        
    
    return found;

【问题讨论】:

请正确缩进。 如果我说:pleaseindentthecode,不像我在上面加空格那么容易阅读,对吧? 看起来像数组的函数参数实际上是指针。您可以增加指针;您不能增加不是函数参数的数组名称。您使用的是哪个版本的 K&R?两者都有点旧,但您不应该使用第一版(1978 年)。 你好,很抱歉没有很好地呈现代码,但它不是代码的逻辑或我所指的代码的工作方式,我的问题很简单,我们如何使用增量数组名? @FiddlingBits 我实际上是在准备一场竞争性考试,这是 C 考试中最推荐的书,所以不得不接受它.. 【参考方案1】:

作为函数参数的数组会自动转换为指针。所以这个:

char *argv[]

完全一样:

char **argv

这就是你被允许做argv++的原因。

【讨论】:

以上是关于来自“Dennis Ritchie 的 C 编程语言”的这个程序中的“++argv”如何正确?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 WCF 服务能够处理来自不同进程的调用而不是来自线程的调用

来自 viewDidAppear 的 Segue 调用有效,但不是来自 viewWillAppear

求职作业帮 C++方向面经

来自 CWnd 的 ReleaseDC 覆盖来自 winuser 的 ReleaseDC

来自麦克风的声音与来自扬声器的声音

Liferay,来自搜索的 Freemarker 错误模板,但不是来自其他链接