我正在尝试让用户键入一个字符串,这样我就会打印字符串的长度。我的代码构建成功。但是,当我输入一个单词并按下'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;
}
答案 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
来表示输入何时结束。