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

use*_*774 3 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;   
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 6

argv[]是保存命令行参数的数组,argv[1]是第一个(argv[0]当然不是命令表示本身).你分配它s然后立即覆盖s,所以这里不需要它.

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

%s它自己会解决这个问题,但如果你所追求的是一整输入,它会引入另一个问题- 它只会读到第一个空格.有关正确的线路输入功能,请参见此处.

它可以进行全线输入,防止缓冲区溢出和检测/清除太长的行,这在scanf("%s")输入法中是非常缺失的.

另外,这里的if语句在while这里是多余的,因为它while本身将捕获字符串的结尾,并且将两者都引用inputs引用相同的数组没有意义(如果你在某些时候改变了它会有意义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;
}
Run Code Online (Sandbox Code Playgroud)

如果你输入Hello,你会看到它5立即打印出来.您还将看到5是否输入Hello Pax,这是选择高级输入功能的一个原因(另一个非常重要的原因是避免在程序中引入缓冲区溢出漏洞).