我目前在编码时遇到了一个问题。问题是我想循环遍历一个字符串,并将每个索引与另一个字符串的索引进行比较。同时,如果另一个字符串还没有索引,则将该字符复制到另一个字符串。下面的代码是我遇到的问题:
我编译了这个,得到了错误: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);
}
2条答案
按热度按时间jdgnovmf1#
需要26
char
的数组,而不是26string
的数组key2[]
未初始化不清楚OP要如何填充它。也许从下一个参数开始?
最好先测试
argc
丢弃不必要的
1
kupeojn62#
这说明了为什么不应该将指针隐藏在
typedef
后面,以及为什么向程序员新手隐藏C的工作方式对任何人都没有好处。C中没有
string
类型。这里的string
只是char *
的typedef
。为
char *
和char *
的array[26]
分配内存,它们不是同义词。或者换句话说:它宣布:
注意,这些语句只为指针分配内存,而不是它们所指向的内容。在本例中,您确实初始化了
key
,但忘记初始化key2
。声明:
因为
key[i]
的计算结果为char
,而key2[j]
的计算结果为char *
(您没有为其分配内存,也没有对其进行初始化)。修复:
只需将
key2
声明为char *
,而不是char *
的数组。现在在复制之前找到
argv[1]
的长度(否则可能导致溢出)。现在为
key2
分配内存:现在用
strcpy()
复制字符串并继续循环,完成后用free()
清空内存。argv[1]
是否有效之前正在访问它。