我试图让用户键入一个字符串,所以我将打印字符串的长度。 我的代码构建成功。 但是,当我输入一个单词并按下'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;   
}

===============>>#1 票数:5

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

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

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

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

另外, whileif语句在这里是多余的,因为while本身将捕获字符串的结尾,并且让inputs引用相同的数组没有意义(如果你改变了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 如果输入Hello Pax ,你也会看到5 ,这是选择高级输入功能的一个原因(另一个非常重要的原因是避免在程序中引入缓冲区溢出漏洞)。

===============>>#2 票数:2

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

a.out 123 abcd

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

===============>>#3 票数: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
  ------------------------------------------------*/

===============>>#4 票数:0

只需更改scanf行:

scanf("%s", s);

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

  ask by user2203774 translate from so

未解决问题?本站智能推荐: