从 C 命令行输入的字符串或字符
String or character input from command line in C
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
char str[1000], ch[100];
int i, frequency = 0;
strcpy(argv[1],str);
strcpy(argv[2], ch);
for(i = 0; str[i]!= '[=10=]'; ++i)
{
if(ch[i] == str[i])
++frequency;
}
printf("Frequency of %c = %d", *ch, frequency);
return (0);
}
编译成功。
输入:你好h
输出是:一些垃圾的频率 = 2
你抄错方向了,原型是
char * strcpy(char *destination, const char *source);
这很可能是未定义的行为。
此外,无需复制字符串,您可以像处理任何其他字符串一样处理参数。
strcpy
函数将第二个参数的值复制到第一个参数。如果你想从命令行参数中使用或访问值(单个字符),那么它就像二维数组一样。
argv[1][0]
我认为您没有很好地理解命令行参数。在命令行中,这并不意味着您键入数字、字符或字符串。它将始终被读取为一个字符串。因此,如果你对 运行 有一些命令,例如
./file-name 123 a myfile 3.14
以上访问方式如下:
agrv[ 1 ] 是具有 "123" 的字符串。要访问第一个字符('1'),我只会写 argv1[0].
agrv[2] 是具有 "a" 的字符串。要访问第一个字符('a'),我只会写 argv1[0].
agrv[3] 是具有 "myfile" 的字符串。要访问第一个字符('m'),我只会写 argv[3][0].
agrv[4] 是具有 "3.14" 的字符串。要访问第一个字符('3'),我只会写 argv[4][0].
您还可以参阅 here 了解有关命令行参数的更多信息。
您不需要将整个字符串复制到另一个字符串中进行任何操作。
#include <stdio.h>
int main (int argc,char *argv[])
{
if(argc==3)
{
int i, frequency = 0;
for(i = 0; argv[1][i]!= '[=10=]'; ++i)
{
if(argv[1][i] == argv[2][0])
++frequency;
}
printf("Frequency of %c = %d", argv[2][0], frequency);
}
else
printf("Invalid no of inputs\n");
return 0;
}
输入:
hello h
输出:
Frequency of h = 1
因为unwind pointed out, you are copying with strcpy()
方向错误。
strcpy(argv[1],str);
strcpy(argv[2], ch);
应该改为
strcpy(str, argv[1]);
strcpy(ch, argv[2]);
我的老师是这样教我的:从右到左。就像 Usain Bolt 在摆出他著名的 victory pose 时的指向方式。他的右手指向左边。
strncpy()
可用于避免溢出而不是 strcpy()
但如果源长度超过指定的大小,则 [=16] 不会将 [=18=]
附加到目标字符串=].
您似乎试图通过命令行输入一个字符串和一个字符,并找出该字符在该字符串中出现的次数。
如果是这样,假设 argv[1]
有字符串而 argv[2]
有字符,
如果 argv[2]
不是单个字符,可能会显示错误消息。
if(strlen(argv[2])!=1)
{
printf("\nError");
exit(1);
}
您还应该检查提供的参数数量(程序名称除外)是否至少为 2。例如,如果只给出一个参数而您尝试使用 argv[2]
,它会导致错误。
if(argc<3)
{
printf("\nNo enough arguments");
}
程序名称计为 argv[0]
中的一个值。参见 here
char c=ch[0];
for(i = 0; str[i]!= '[=14=]'; ++i)
{
if(c == str[i])
++frequency;
}
printf("Frequency of %c = %d", c, frequency);
使用 ch[0]
而不是 c
应该也可以。
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
char str[1000], ch[100];
int i, frequency = 0;
strcpy(argv[1],str);
strcpy(argv[2], ch);
for(i = 0; str[i]!= '[=10=]'; ++i)
{
if(ch[i] == str[i])
++frequency;
}
printf("Frequency of %c = %d", *ch, frequency);
return (0);
}
编译成功。
输入:你好h 输出是:一些垃圾的频率 = 2
你抄错方向了,原型是
char * strcpy(char *destination, const char *source);
这很可能是未定义的行为。
此外,无需复制字符串,您可以像处理任何其他字符串一样处理参数。
strcpy
函数将第二个参数的值复制到第一个参数。如果你想从命令行参数中使用或访问值(单个字符),那么它就像二维数组一样。
argv[1][0]
我认为您没有很好地理解命令行参数。在命令行中,这并不意味着您键入数字、字符或字符串。它将始终被读取为一个字符串。因此,如果你对 运行 有一些命令,例如
./file-name 123 a myfile 3.14
以上访问方式如下:
agrv[ 1 ] 是具有 "123" 的字符串。要访问第一个字符('1'),我只会写 argv1[0].
agrv[2] 是具有 "a" 的字符串。要访问第一个字符('a'),我只会写 argv1[0].
agrv[3] 是具有 "myfile" 的字符串。要访问第一个字符('m'),我只会写 argv[3][0].
agrv[4] 是具有 "3.14" 的字符串。要访问第一个字符('3'),我只会写 argv[4][0].
您还可以参阅 here 了解有关命令行参数的更多信息。
您不需要将整个字符串复制到另一个字符串中进行任何操作。
#include <stdio.h>
int main (int argc,char *argv[])
{
if(argc==3)
{
int i, frequency = 0;
for(i = 0; argv[1][i]!= '[=10=]'; ++i)
{
if(argv[1][i] == argv[2][0])
++frequency;
}
printf("Frequency of %c = %d", argv[2][0], frequency);
}
else
printf("Invalid no of inputs\n");
return 0;
}
输入:
hello h
输出:
Frequency of h = 1
因为unwind pointed out, you are copying with strcpy()
方向错误。
strcpy(argv[1],str);
strcpy(argv[2], ch);
应该改为
strcpy(str, argv[1]);
strcpy(ch, argv[2]);
我的老师是这样教我的:从右到左。就像 Usain Bolt 在摆出他著名的 victory pose 时的指向方式。他的右手指向左边。
strncpy()
可用于避免溢出而不是 strcpy()
但如果源长度超过指定的大小,则 [=16] 不会将 [=18=]
附加到目标字符串=].
您似乎试图通过命令行输入一个字符串和一个字符,并找出该字符在该字符串中出现的次数。
如果是这样,假设 argv[1]
有字符串而 argv[2]
有字符,
如果 argv[2]
不是单个字符,可能会显示错误消息。
if(strlen(argv[2])!=1)
{
printf("\nError");
exit(1);
}
您还应该检查提供的参数数量(程序名称除外)是否至少为 2。例如,如果只给出一个参数而您尝试使用 argv[2]
,它会导致错误。
if(argc<3)
{
printf("\nNo enough arguments");
}
程序名称计为 argv[0]
中的一个值。参见 here
char c=ch[0];
for(i = 0; str[i]!= '[=14=]'; ++i)
{
if(c == str[i])
++frequency;
}
printf("Frequency of %c = %d", c, frequency);
使用 ch[0]
而不是 c
应该也可以。