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];
此外,您可以使用 malloc
和 stdlib.h
的 memcpy
和 string.h
的 strlen
将 argv[1]
复制到 s
(如果以后想用s
做一些修改推荐):
size_t len = strlen(argv[1]))+1; // 1 for NULL byte
char *s = malloc(len);
memcpy(s, argv[1], len);
第二种方法的优点是能够realloc
稍后占用内存。
我正在为练习创建一个大写函数。我想用 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];
此外,您可以使用 malloc
和 stdlib.h
的 memcpy
和 string.h
的 strlen
将 argv[1]
复制到 s
(如果以后想用s
做一些修改推荐):
size_t len = strlen(argv[1]))+1; // 1 for NULL byte
char *s = malloc(len);
memcpy(s, argv[1], len);
第二种方法的优点是能够realloc
稍后占用内存。