C argv[]中的Int将中断并仅打印Int
所以我知道这是最基本的,但我不知道在哪里可以找到正确的答案。问题是,我需要运行一个带有参数-s的程序,后面跟一个数字,告诉它要跳过多少个输入字符,比如说我们需要(我在bash中运行它): 它应该只打印C argv[]中的Int将中断并仅打印Int,c,argv,C,Argv,所以我知道这是最基本的,但我不知道在哪里可以找到正确的答案。问题是,我需要运行一个带有参数-s的程序,后面跟一个数字,告诉它要跳过多少个输入字符,比如说我们需要(我在bash中运行它): 它应该只打印e,但是shell会给我 2someone@somewhere: 在这一点上,我被困了好几个小时,没办法弄清楚,请帮帮我 int main(int argc, char *argv[]) { char s; char input[8196]; int i = 0; /
e
,但是shell会给我
2someone@somewhere:
在这一点上,我被困了好几个小时,没办法弄清楚,请帮帮我
int main(int argc, char *argv[]) {
char s;
char input[8196];
int i = 0;
/* above initialized are variables needed for the root of the program to work */
int s_num = 0; /* "-s" or skip */
int cnt_1; /* lvl1 counter */
/* Getting input */
while ((s = getchar()) != EOF) {
input[i] = s;
printf("%d\n", i);
i++;
}
/* If calling w/o arguments, the only thing that works */
if (argc == 1) {
//do stuff
}
/* Argument Check */
if (argc > 1) {
printf("1\n");
for (cnt_1 = 0; cnt_1 < argc; cnt_1++) {
printf("2\n");
if (strcmp(argv[cnt_1], "-s") == 1) {
printf("3.1\n");
int pom = cnt_1 + 1;
int bqs = 0;
for (int i = 0; argv[pom][i] != '\0'; ++i) {
bqs *= 10; bqs += argv[pom][i] - '0';
}
s_num = bqs;
}
...
intmain(intargc,char*argv[]){
字符s;
字符输入[8196];
int i=0;
/*上面初始化的是程序根运行所需的变量*/
int s_num=0;/*“-s”或跳过*/
int cnt_1;/*lvl1计数器*/
/*获取输入*/
而((s=getchar())!=EOF){
输入[i]=s;
printf(“%d\n”,i);
i++;
}
/*如果调用w/o参数,唯一有效的方法是*/
如果(argc==1){
//做事
}
/*参数检查*/
如果(argc>1){
printf(“1\n”);
对于(cnt_1=0;cnt_1
这应该是0。strcmp
在相等时返回0
01 2 3 1 2
3.1.2
这就是我从输出中得到的结果,也是可以预期的,因为最后一个是-s的值。你确定你的strcmp工作正常吗
这应该是0。strcmp
在相等时返回0
01 2 3 1 2
3.1.2
这就是我从输出中得到的结果,也是可以预期的结果,因为最后一个参数是-s的值。您确定strcmp工作正常吗?第一个参数,即
argv[0]
包含可执行文件的名称。
因此,从数组的第二个元素开始搜索参数argv[1]
for (cnt_1 = 1; cnt_1 < argc; cnt_1++)
// ^ change 0 to 1 here
第一个参数,即
argv[0]
包含可执行文件的名称。
因此,从数组的第二个元素开始搜索参数argv[1]
for (cnt_1 = 1; cnt_1 < argc; cnt_1++)
// ^ change 0 to 1 here
您的代码中存在多个问题:
应该是char s;
否则((s=getchar())!=EOF)时的循环int s;
不能正常工作。根据默认情况下类型
是有符号的还是无符号的,它将在char
字符上提前停止,或者无法完全匹配\377
EOF
- 在
之前,不检查input[i]=s;
是否小于i
。任何足够长的输入文件都会导致缓冲区溢出sizeof(input)
- 检查此参数是否与
不同后,应使用NULL
转换size参数atoi(argv[cnt_1+1])
- 如果无法使用
检查参数值或strcmp()
转换数字,请使用指针变量并分别检查字符:atoi()
char *p = argv[cnt_1]; if (p[0] == '-' && p[1] == 's' && p[2] == '\0') { int skip = 0; char *s = argv[cnt_1 + 1]; if (s != NULL) { while (*s >= '0' && *s <= '9') { skip = skip * 10 + *s++ - '0'; } } }
时的循环char*p=argv[cnt_1]; 如果(p[0]='-'&&p[1]='s'&&p[2]=='\0'){ int skip=0; char*s=argv[cnt_1+1]; 如果(s!=NULL){
虽然(*s>='0'&&*s您的代码中存在多个问题:
应该是char s;
否则((s=getchar())!=EOF)int s;
不能正常工作。根据默认情况下类型
是有符号的还是无符号的,它将在char
字符上提前停止,或者无法完全匹配\377
EOF
- 在
之前,不检查input[i]=s;
是否小于i
。任何足够长的输入文件都会导致缓冲区溢出sizeof(input)
- 检查此参数是否与
不同后,应使用NULL
转换size参数atoi(argv[cnt_1+1])
- 如果无法使用
检查参数值或strcmp()
转换数字,请使用指针变量并分别检查字符:atoi()
char *p = argv[cnt_1]; if (p[0] == '-' && p[1] == 's' && p[2] == '\0') { int skip = 0; char *s = argv[cnt_1 + 1]; if (s != NULL) { while (*s >= '0' && *s <= '9') { skip = skip * 10 + *s++ - '0'; } } }
函数,返回一个布尔值,只需测试char*p=argv[cnt_1]; 如果(p[0]='-'&&p[1]='s'&&p[2]=='\0'){ int skip=0; char*s=argv[cnt_1+1]; 如果(s!=NULL){
当(*s>='0'&&*s我的坏消息时,我被禁止使用,因此这是我自己的strcmp,并在eq@JozefTománek你确定你的strcmp工作正常吗?@JozefTománek:不要用不同的语义重新实现标准函数,这是邪恶的
my bad我被禁止使用,因此这是我自己的strcmp,并在eq@JozefTománek你确定你的strcmp工作正常吗?@JozefTománek:不要用不同的语义重新实现标准函数,这是邪恶的。编写一个if(strequal(argv[cnt_1],“-s”)){
函数,返回一个布尔值,只需测试strequal()
您在下面的评论中说“我的坏东西,我禁止使用”。因此,只需通过if(strequal(argv[cnt_1],“-s”){
比较char
字符串数组中包含的字符串来执行argv
。(通常情况下,编写已经包含在C标准库中的函数的您自己的版本不是一个好主意,除非它是专门指定给您这样做的。)您在下面的评论中说“我的坏,我被禁止使用”因此,只需对char
字符串数组中包含的字符串进行argv
比较就可以了。(通常情况下,编写C中已经包含的函数的自己版本不是一个好主意。)char
char *p = argv[cnt_1]; if (p[0] == '-' && p[1] == 's' && p[2] == '\0') { int skip = 0; char *s = argv[cnt_1 + 1]; if (s != NULL) { while (*s >= '0' && *s <= '9') { skip = skip * 10 + *s++ - '0'; } } }