C 什么';我的代码怎么了?什么是argv[1]?
我试图要求用户键入一个字符串,以便打印字符串的长度。我的代码构建成功了。然而,当我输入一个单词并按下“回车”键时,程序仍在运行。我必须输入第二个单词,然后显示第一个字符串的长度。我对argv[1]感到困惑。有人能给我一些关于如何解决这个问题的提示吗?提前感谢您抽出时间 请注意,我不允许使用任何字符串函数C 什么';我的代码怎么了?什么是argv[1]?,c,pointers,argv,C,Pointers,Argv,我试图要求用户键入一个字符串,以便打印字符串的长度。我的代码构建成功了。然而,当我输入一个单词并按下“回车”键时,程序仍在运行。我必须输入第二个单词,然后显示第一个字符串的长度。我对argv[1]感到困惑。有人能给我一些关于如何解决这个问题的提示吗?提前感谢您抽出时间 请注意,我不允许使用任何字符串函数 int main(int argc, char* argv[]){ char* s=argv[1]; char input[256]; s = input;
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;
}
只需更改
scanf
行:
scanf("%s", s);
正如您所看到的(
scanf(“%s\n”,s);
),它需要一个以\n
结尾的字符序列,然后另一个\n
来指示输入何时完成。argv[]
是保存命令行参数的数组,argv[1]
是第一个数组(当然,除了在argv[0]
中的命令表示本身之外)。您可以将其分配给s
,然后立即覆盖s
,因此这里实际上不需要它
您必须输入两行的原因是输入格式末尾的\n
。它需要与格式字符串匹配的任何内容,然后是换行符,因此%s\n
正在吃掉您的第一行换行符,因此scanf
必须返回另一行
%s
本身可以解决该问题,但如果您要的是一整行输入,则会引入另一个问题-它最多只能读取第一个空格。有关正确的行输入函数,请参阅
它执行全行输入,防止缓冲区溢出,并检测/清除过长的行,这是scanf(“%s”)
输入方法中严重缺失的内容
此外,while
中的if
语句在这里是多余的,因为while
本身将捕获字符串的结尾,并且input
和s
都引用同一数组没有什么意义(如果您在某个时候更改了s
,这是有道理的,但在这里不会发生这种情况)
因此,没有高级线路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;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
字符输入[256];
int str_length=0;
printf(“请输入字符串:”);
扫描频率(“%s”,输入);
当(输入[StruthReal]='\' 0)/*或考虑使用StRelf()*
str_length++;
printf(“%d\n”,str\u长度);
返回0;
}
如果您输入
Hello
,您将看到它立即打印出5
。如果您输入Hello Pax
,您还将看到5
,这是选择高级输入功能的一个原因(另一个非常重要的原因是避免在程序中引入缓冲区溢出漏洞).argv用于传递进程参数。这意味着您可以像
a.out 123 abcd
argv[1]已被分配给123的值。您不必像现在这样读取它。在当前代码中,在分配argv[1]后,您正在将s的引用覆盖到新字符串中。这就是您想要的
#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[1]
是第一个命令行参数,但在这段代码中根本没有使用它;s
最初设置为指向它,但在使用该值之前,s
设置为指向input
。我不确定我们是否理解您希望代码执行的操作。您能给我们一个您体验的输入和输出示例吗ting?您的输入可以是由空格分隔的多个单词?或者您是否将此限制为仅单个单词的输入?@user2203774不会根据答案编辑您的问题。这将是不连续的。请使用“编辑:”(或类似内容)明确表示如果可能的话,也向他解释argv=Dargv是(char*)的数组,也就是说bash>a.out a B C argc=5,argv[0]=a.out,argv[1]=a,argv[2]=B,argv[3]=C,这只是关于如何编辑答案以改进它的建议;)
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
------------------------------------------------*/