【问题标题】:How to make strcmp() work in my C program如何使 strcmp() 在我的 C 程序中工作
【发布时间】:2016-02-24 06:30:45
【问题描述】:

我即将对一个文本字符串进行加密,使用另一个文本字符串作为我的加密“密钥”。它基本上只是对 ASCII 字符的重组。

密钥已给出并且结构错误,需要一些额外的编程。 ASCII 字符在此密钥中列出,每行一个字符,对应的加密字符在两个索引之外。

这是“key.txt”的例子:

A g
B 9
C ü
D (
E z

...继续所有 ASCII 字符。因此,我的程序中的加密会导致:

"EDABEDA" -> "z(g9z(g"

当我进行加密时。

  1. 我让程序接受一个输入字符串,然后用加密密钥字符创建另一个字符串。

  2. 我使用 for-sling 遍历输入字符串中的每个字符。对于输入字符串中的每个字符,我检查我的加密密钥字符串中是否有匹配的字符。在加密密钥中,我一次跳 4 步,因为我要加密并且只需要比较 A、B、C、D...

  3. 我使用 strcmp() 来查找匹配项。并且当匹配时,当输入字符串中的字符与加密密钥中的字符相同时,我将加密字符写入输出字符串。加密字符被放置在密钥字符串中主要字符之前的两个索引处。

  4. 警告出现在 strcmp()

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 3000

void encryption(char *input);

int main()
{
    char input[] = "EDABEDA";
    encryption(input);
}

void encryption(char *input)
{
    int length,i,k;
    size_t result;
    char dicc[1000];
    char output[SIZE];
    FILE *f;

    f = fopen("key.txt","r");

    fseek(f, 0, SEEK_END);
    length = ftell(f);
    fseek(f, 0, SEEK_SET);
    result = fread(dicc, 1, length, f);

    int lenDic = strlen(dicc);
    int lenInp = strlen(input);

    for (i = 0 ; i < lenInp ; i++)
    {
        for (k = 4 ; k < lenDic ; k = k + 4)
        {
            if (strcmp(input[i],dicc[k]) == 0)
            {
                output[i] = dicc[k+2];
                printf("%c",output[i]);
            }
        }
    }
    fclose(f);
}

我收到以下警告,但程序无法运行。谁能帮助我解决这个 strcmp 警告并知道我应该如何重新安排我的程序以满足其要求?

warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast [enabled by default]
if (strcmp(input[i],dicc[k]) == 0)
^
In file included from crypt.c:3:0:
/usr/include/string.h:144:12: note: expected ‘const char *’ but argument is of type ‘char’
 extern int strcmp (const char *__s1, const char *__s2)
            ^
warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast [enabled by default]
if (strcmp(input[i],dicc[k]) == 0)
^
In file included from crypt.c:3:0:
/usr/include/string.h:144:12: note: expected ‘const char *’ but argument is of type ‘char’
extern int strcmp (const char *__s1, const char *__s2)
           ^

【问题讨论】:

    标签: c string pointers strcmp


    【解决方案1】:

    使用strcmp() 比较字符串,而不是字符。对于你的情况

    if (input[i] == dicc[k])
    

    应该可以。

    注意char只是一个整数类型不是字符串类型,c中没有字符串类型。还有一件事,编写安全代码!检查fopen() 成功,如果length 不超过999。几乎所有可以被视为错误的事情。

    【讨论】:

    • 谢谢一百万!并感谢有关安全代码的提示!
    • 在加密中,我希望它避免翻译空格,并且它们应该被翻译为空格。空格不包含在密钥中。当我在 if 语句下放置一个“else if”语句时,说明:(input[i]="") 然后是 output[i]=""。它给了我和以前一样的错误。如何实现这种条件?
    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多