从 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 应该也可以。