我的代码出了什么问题?什么是argv [1]?

时间:2013-04-16 02:29:34

标签: c pointers argv

我正在尝试让用户键入一个字符串,这样我就会打印字符串的长度。我的代码构建成功。但是,当我输入一个单词并按下'enter'时,程序继续运行。我必须输入第二个单词,然后显示第一个字符串的长度。我对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;   
}

4 个答案:

答案 0 :(得分:5)

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

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

%s它自己会解决这个问题,但如果您所追求的是输入的完整,则会引入另一个问题 - 它只能读取第一个空格。有关正确的线路输入功能,请参阅here

它执行全行输入,防止缓冲区溢出和检测/清除太长的行,scanf("%s")输入法中缺少某些东西。

此外,if中的while语句在这里是多余的,因为while本身将捕获字符串的结尾,并且同时拥有{{1}毫无意义}和input引用相同的数组(如果你在某个时候更改了s 会有意义,但这里没有发生这种情况)。

因此,没有高级线路输入功能的变种可以简单如下:

s

如果您输入#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; } ,则会立即打印出Hello。如果输入5,您还会看到5,这是选择高级输入功能的一个原因(另一个非常重要的原因是避免在程序中引入缓冲区溢出漏洞)。

答案 1 :(得分:2)

argv用于传递进程参数。这意味着您可以运行您的程序,如

a.out 123 abcd

argv [1]已经被赋值为123.你不必像现在这样读它。在当前代码中,在使用argv [1]进行分配后,将覆盖s对新字符串的引用。

答案 2 :(得分:1)

这就是你想要的

#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和argc是另一回事: argv [0] = a.exe argv [1] = 12345

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
  ------------------------------------------------*/

答案 3 :(得分:0)

只需更改scanf行:

scanf("%s", s);

正如您所拥有的那样(scanf("%s\n", s);),它需要以\n结尾的一系列字符,然后是另一个\n来表示输入何时结束。