argv[] 中的 Int 中断并仅打印 int
Int in argv[] breaks and just prints the int
所以我知道这是基础知识,但我不知道在哪里可以找到正确的答案。问题是我需要 运行 一个带有参数 -s 后跟一个数字的程序,告诉它从输入中跳过多少个字符,假设我们这样做(我 运行 它在 bash 中):
echo "hue" |./prog -s 2
然后应该只打印 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] != '[=11=]'; ++i) {
bqs *= 10; bqs += argv[pom][i] - '0';
}
s_num = bqs;
}
...
if (strcmp(argv[cnt_1], "-s") == 1)
那应该是 0。strcmp
returns 0 等于。
0 1 2 3 1 2 2
3.1 2
这就是我从输出中得到的结果,这是预期的结果,因为最后一个是 -s 的值。您确定您的 strcmp 正常工作吗?
第一个参数,即 argv[0]
包含可执行文件的名称。
因此,从数组 argv[1]
的第二个元素开始搜索参数,然后从那里开始。
for (cnt_1 = 1; cnt_1 < argc; cnt_1++)
// ^ change 0 to 1 here
如果,如您在评论中所说,不允许使用 <string.h>
,那么也许您可以通过 char
对包含在通过循环时 argv[]
的字符串数组:
...
if((argv[cnt_1][0] == '-') && (argv[cnt_1][1] == 's'))//argument "-s" found, handle it
{
...
您的代码中存在多个问题:
char s;
应该是 int s;
否则循环 while ((s = getchar()) != EOF)
不能正常工作。根据 char
类型默认是有符号还是无符号,它会在 7
个字符上过早停止或无法完全匹配 EOF
。
你在input[i] = s;
之前不检查i
是否小于sizeof(input)
。任何足够长的输入文件都会导致缓冲区溢出。
你应该使用 atoi(argv[cnt_1 + 1])
来转换大小参数,在检查这个参数是否不同于 NULL
之后。
如果您不能使用strcmp()
检查参数值或atoi()
转换数字,请使用指针变量并单独检查字符:
char *p = argv[cnt_1];
if (p[0] == '-' && p[1] == 's' && p[2] == '[=10=]') {
int skip = 0;
char *s = argv[cnt_1 + 1];
if (s != NULL) {
while (*s >= '0' && *s <= '9') {
skip = skip * 10 + *s++ - '0';
}
}
}
最后但同样重要的是:如果你可以使用 strcmp()
,你不应该对其 return 值做出超出它可以为负的事实的假设,0
或正数。您应该将 strcmp(argv[cnt_1], "-s") == 1
更改为 strcmp(argv[cnt_1], "-s") == 0
以检查字符串是否相同。它 strcmp()
是您自己的实现,如果您在评论中暗示,给它不同的语义将 非常 容易出错。而是编写一个 strequal()
函数,该函数 return 是一个布尔值,只测试 if (strequal(argv[cnt_1], "-s"))
所以我知道这是基础知识,但我不知道在哪里可以找到正确的答案。问题是我需要 运行 一个带有参数 -s 后跟一个数字的程序,告诉它从输入中跳过多少个字符,假设我们这样做(我 运行 它在 bash 中):
echo "hue" |./prog -s 2
然后应该只打印 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] != '[=11=]'; ++i) {
bqs *= 10; bqs += argv[pom][i] - '0';
}
s_num = bqs;
}
...
if (strcmp(argv[cnt_1], "-s") == 1)
那应该是 0。strcmp
returns 0 等于。
0 1 2 3 1 2 2 3.1 2
这就是我从输出中得到的结果,这是预期的结果,因为最后一个是 -s 的值。您确定您的 strcmp 正常工作吗?
第一个参数,即 argv[0]
包含可执行文件的名称。
因此,从数组 argv[1]
的第二个元素开始搜索参数,然后从那里开始。
for (cnt_1 = 1; cnt_1 < argc; cnt_1++)
// ^ change 0 to 1 here
如果,如您在评论中所说,不允许使用 <string.h>
,那么也许您可以通过 char
对包含在通过循环时 argv[]
的字符串数组:
...
if((argv[cnt_1][0] == '-') && (argv[cnt_1][1] == 's'))//argument "-s" found, handle it
{
...
您的代码中存在多个问题:
char s;
应该是int s;
否则循环while ((s = getchar()) != EOF)
不能正常工作。根据char
类型默认是有符号还是无符号,它会在7
个字符上过早停止或无法完全匹配EOF
。你在
input[i] = s;
之前不检查i
是否小于sizeof(input)
。任何足够长的输入文件都会导致缓冲区溢出。你应该使用
atoi(argv[cnt_1 + 1])
来转换大小参数,在检查这个参数是否不同于NULL
之后。如果您不能使用
strcmp()
检查参数值或atoi()
转换数字,请使用指针变量并单独检查字符:char *p = argv[cnt_1]; if (p[0] == '-' && p[1] == 's' && p[2] == '[=10=]') { int skip = 0; char *s = argv[cnt_1 + 1]; if (s != NULL) { while (*s >= '0' && *s <= '9') { skip = skip * 10 + *s++ - '0'; } } }
最后但同样重要的是:如果你可以使用
strcmp()
,你不应该对其 return 值做出超出它可以为负的事实的假设,0
或正数。您应该将strcmp(argv[cnt_1], "-s") == 1
更改为strcmp(argv[cnt_1], "-s") == 0
以检查字符串是否相同。它strcmp()
是您自己的实现,如果您在评论中暗示,给它不同的语义将 非常 容易出错。而是编写一个strequal()
函数,该函数 return 是一个布尔值,只测试if (strequal(argv[cnt_1], "-s"))