C语言 如何通过一个字符串的循环来与另一个字符串的索引进行比较?

rmbxnbpk  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(197)

我目前在编码时遇到了一个问题。问题是我想循环遍历一个字符串,并将每个索引与另一个字符串的索引进行比较。同时,如果另一个字符串还没有索引,则将该字符复制到另一个字符串。下面的代码是我遇到的问题:
我编译了这个,得到了错误:comparison between pointer and integer ('char' and 'string' (aka 'char *')) [-Werror,-Wpointer-integer-compare]

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(int argc, string argv[1])
{
    string key = argv[1], key2[26];

 for (int i = 0; key[i] != '\0' ; i++)
    {
        int j = 0;

        if (key[i] != key2[j]) // I got an error here
        {
            key2[j] = key[i];
            j++
        }
    }
    printf("%s\n", key2);
}
jdgnovmf

jdgnovmf1#

需要26 char的数组,而不是26 string的数组

// string key = argv[1], key2[26];
string key = argv[1];
char key2[26];

key2[]未初始化

不清楚OP要如何填充它。也许从下一个参数开始?

最好先测试argc

if (argc < 2) {
  fprintf(stderr, "Missing argument\n");
  return EXIT_FAILURE;
}
string key = argv[1];
...

丢弃不必要的1

// int main(int argc, string argv[1])
int main(int argc, string argv[])
kupeojn6

kupeojn62#

这说明了为什么不应该将指针隐藏在typedef后面,以及为什么向程序员新手隐藏C的工作方式对任何人都没有好处。
C中没有string类型。这里的string只是char *typedef

string key = argv[1], key2[26];

char *char *array[26]分配内存,它们不是同义词。
或者换句话说:它宣布:

char *key = argv[1];
char *key2[26];

注意,这些语句只为指针分配内存,而不是它们所指向的内容。在本例中,您确实初始化了key,但忘记初始化key2
声明:

if (key[i] != key2[j])

因为key[i]的计算结果为char,而key2[j]的计算结果为char *(您没有为其分配内存,也没有对其进行初始化)。

修复:

只需将key2声明为char *,而不是char *的数组。
现在在复制之前找到argv[1]的长度(否则可能导致溢出)。

size_t len = strlen (argv[1]);

现在为key2分配内存:

char *key2 = malloc (len + 1); /* One for the '\0' byte */
if (!key2) {
    /* ENOMEM, handle error accordingly */
}

现在用strcpy()复制字符串并继续循环,完成后用free()清空内存。

    • 次要:**您在检查argv[1]是否有效之前正在访问它。
if (argc != 2) {
     fprintf (stderr, "/* Print usage message here */.\n");
     return EXIT_FAILURE;
 }

相关问题