3

我试图让用户输入一个字符串,以便打印字符串的长度。我的代码构建成功。但是,当我输入一个单词并按下“输入”时,程序继续运行。我必须输入第二个单词,然后显示第一个字符串的长度。我对 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

4 回答 4

6

argv[]是保存您的命令行参数的数组,argv[1]是第一个(argv[0]当然,除了命令表示本身之外)。您将其分配给sthen immediate overwrite s,因此这里并不真正需要它。

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

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

scanf("%s")它进行全行输入,防止缓冲区溢出和检测/清理过长的行,这是输入法中严重缺失的东西。

此外,这里的if语句while是多余的,因为它while本身会捕获字符串的结尾,同时拥有两者inputs引用同一个数组几乎没有意义(如果你在某个时候进行了更改,这s是有意义的,但这不是发生在这里)。

因此,没有高级 line 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;
}

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

于 2013-04-16T02:34:20.840 回答
2

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

a.out 123 abcd

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

于 2013-04-16T02:35:41.113 回答
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
  ------------------------------------------------*/
于 2013-04-16T02:47:01.637 回答
0

只需更改scanf行:

scanf("%s", s);

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

于 2013-04-16T02:34:03.137 回答