Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么';我的代码怎么了?什么是argv[1]?_C_Pointers_Argv - Fatal编程技术网

C 什么';我的代码怎么了?什么是argv[1]?

C 什么';我的代码怎么了?什么是argv[1]?,c,pointers,argv,C,Pointers,Argv,我试图要求用户键入一个字符串,以便打印字符串的长度。我的代码构建成功了。然而,当我输入一个单词并按下“回车”键时,程序仍在运行。我必须输入第二个单词,然后显示第一个字符串的长度。我对argv[1]感到困惑。有人能给我一些关于如何解决这个问题的提示吗?提前感谢您抽出时间 请注意,我不允许使用任何字符串函数 int main(int argc, char* argv[]){ char* s=argv[1]; char input[256]; s = input;

我试图要求用户键入一个字符串,以便打印字符串的长度。我的代码构建成功了。然而,当我输入一个单词并按下“回车”键时,程序仍在运行。我必须输入第二个单词,然后显示第一个字符串的长度。我对argv[1]感到困惑。有人能给我一些关于如何解决这个问题的提示吗?提前感谢您抽出时间

请注意,我不允许使用任何字符串函数

   int main(int argc, char* argv[]){

    char* s=argv[1];

    char input[256];
    s = input;
    printf("Please enter a string: ");
    scanf("%s\n", s);
    int str_length = 0;
    while (s[str_length] != '\0')
    {
        str_length++;
        if (s[str_length] == '\0') break;
    }

    printf("%d\n", str_length);


    return 0;   
}

只需更改
scanf
行:

scanf("%s", s);

正如您所看到的(
scanf(“%s\n”,s);
),它需要一个以
\n
结尾的字符序列,然后另一个
\n
来指示输入何时完成。

argv[]
是保存命令行参数的数组,
argv[1]
是第一个数组(当然,除了在
argv[0]
中的命令表示本身之外)。您可以将其分配给
s
,然后立即覆盖
s
,因此这里实际上不需要它

您必须输入两行的原因是输入格式末尾的
\n
。它需要与格式字符串匹配的任何内容,然后是换行符,因此
%s\n
正在吃掉您的第一行换行符,因此
scanf
必须返回另一行

%s
本身可以解决该问题,但如果您要的是一整行输入,则会引入另一个问题-它最多只能读取第一个空格。有关正确的行输入函数,请参阅

它执行全行输入,防止缓冲区溢出,并检测/清除过长的行,这是
scanf(“%s”)
输入方法中严重缺失的内容

此外,
while
中的
if
语句在这里是多余的,因为
while
本身将捕获字符串的结尾,并且
input
s
都引用同一数组没有什么意义(如果您在某个时候更改了
s
,这是有道理的,但在这里不会发生这种情况)

因此,没有高级线路iput功能的变体可以简单到:

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

int main (int argc, char* argv[]) {
    char input[256];
    int str_length = 0;

    printf ("Please enter a string: ");
    scanf ("%s", input);
    while (input[str_length] != '\0')    /* Or consider using strlen() */
        str_length++;

    printf ("%d\n", str_length);

    return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
字符输入[256];
int str_length=0;
printf(“请输入字符串:”);
扫描频率(“%s”,输入);
当(输入[StruthReal]='\' 0)/*或考虑使用StRelf()*
str_length++;
printf(“%d\n”,str\u长度);
返回0;
}

如果您输入
Hello
,您将看到它立即打印出
5
。如果您输入
Hello Pax
,您还将看到
5
,这是选择高级输入功能的一个原因(另一个非常重要的原因是避免在程序中引入缓冲区溢出漏洞).argv用于传递进程参数。这意味着您可以像

a.out 123 abcd
argv[1]已被分配给123的值。您不必像现在这样读取它。在当前代码中,在分配argv[1]后,您正在将s的引用覆盖到新字符串中。

这就是您想要的

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

#define MAX 100

int main(int argc, char* argv[]){
    char tmp[MAX];
    printf("Plese enter a string:\n");
    scanf("%s", tmp);
    printf("the length is %d\n", strlen(tmp));

    return 0;   
}

argv[1]
是第一个命令行参数,但在这段代码中根本没有使用它;
s
最初设置为指向它,但在使用该值之前,
s
设置为指向
input
。我不确定我们是否理解您希望代码执行的操作。您能给我们一个您体验的输入和输出示例吗ting?您的输入可以是由空格分隔的多个单词?或者您是否将此限制为仅单个单词的输入?@user2203774不会根据答案编辑您的问题。这将是不连续的。请使用“编辑:”(或类似内容)明确表示如果可能的话,也向他解释argv=Dargv是(char*)的数组,也就是说bash>a.out a B C argc=5,argv[0]=a.out,argv[1]=a,argv[2]=B,argv[3]=C,这只是关于如何编辑答案以改进它的建议;)
int main(int argc, char* argv[]){
    printf("the length is %d\n", strlen(argv[1]));

    return 0;   
}
/*-------------------- Output --------------------
 > a.out 12345
 the length is 5
  ------------------------------------------------*/