C:如何将argv实现成变量并实现for循环?

C: How to implement argv into variable and implement for loop?

我正在为练习创建一个大写函数。我想用 for 循环实现 argc 和 argv 参数,以检查我的代码中的每个输入值,但是当这样使用 argv 时,它不起作用:

char s[] = argv[0];

但这是有效的:

uppercase(argv[1]);

如何使用 for 循环将我的参数实现到变量中?

这是我的代码;

Main.c:

#include <stdio.h>
#include <stdlib.h>

#include "upperc.h"


int main(int argc, char *argv[])
{
    char s[] = argv[1]; // This is giving me a error.

    printf("%s \n", uppercase(argv[1])); // This is working

    return 0;
}

upper.c:

/*
Parsing the string, then making the letters to uppercase.
*/

#include <stdio.h>
#include "upperc.h"

#define MAGIC_NUMBER 32 //6th bit ability of letter chars

char * uppercase(char *s) {
    for(char *p = s; *p; ++p) {
        if ('a' <= *p && *p <= 'z')
            *p = *p - MAGIC_NUMBER;
    }

    return s;
}

upper.h:

#ifndef UPPERC_H_INCLUDED
#define UPPERC_H_INCLUDED

char * uppercase(char *s);

#endif // UPPERC_H_INCLUDED

案例 1

char s[] = argv[0];这里s是数组,argv[0]是指针或地址。

不能在数组中存储一些指针

改为使用char *cmd_arg = argv[0];

如果您想读取一组命令行参数,请使用循环来迭代一组命令行输入

//since argv[0] indicates program name , starting `a` from 1 instead of 0
for(int a = 1; a < argc; a++)
    uppercase(argv[a]);   

案例2

uppercase(argv(1)); 我想你的意思是 uppercase(argv[1]);

这很好,因为 uppercase 正在接受一个指针 char*

您应该使用字符指针而不是字符数组:

char *s = argv[1];

参考这个:What is the difference between char array and char pointer in C?

argv[1] 不是字符数组。它是指向 char 数组的指针。所以你需要像这样分配 char :

char *s = argv[1];

此外,您可以使用 mallocstdlib.hmemcpystring.hstrlenargv[1] 复制到 s(如果以后想用s做一些修改推荐):

size_t len = strlen(argv[1]))+1; // 1 for NULL byte
char *s = malloc(len);
memcpy(s, argv[1], len);

第二种方法的优点是能够realloc稍后占用内存。