Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中不使用strcmp压缩字符数组_C_Arrays_Pointers_Char - Fatal编程技术网

在C中不使用strcmp压缩字符数组

在C中不使用strcmp压缩字符数组,c,arrays,pointers,char,C,Arrays,Pointers,Char,我正在寻找一种方法来比较没有strcmp的2个字符数组。 这是路吗?还是我遗漏了什么?当我编译它时,如果我在这两个文件中输入相同的字符串,程序就会卡住,什么也做不了。请帮忙 编辑:对不起,这是我的意思,不是C int compare_info(char *array1, char *array2) { int i; i = 0; while(array1[i] == array2[i]) { if(array1[i] == '\0' || array2[i] == '\0')

我正在寻找一种方法来比较没有strcmp的2个字符数组。 这是路吗?还是我遗漏了什么?当我编译它时,如果我在这两个文件中输入相同的字符串,程序就会卡住,什么也做不了。请帮忙

编辑:对不起,这是我的意思,不是C

int compare_info(char *array1, char *array2)
{

int i;
i = 0;

while(array1[i] == array2[i])
{
    if(array1[i] == '\0' || array2[i] == '\0')
        break;
    i++;
}

if(array1[i] == '\0' && array2[i] == '\0')
return 0;

else
    return-1;

}

这里有一个解决方案

int compare_info(char *array1, char *array2)
{
    if ((array1 == NULL) || (array2 == NULL))
        return 0;
    while ((*array1 != '\0') && (*array2 != '\0') && (*array1 == *array2))
    {
        array1++;
        array2++;
    }
    return (*array1 == *array2);
}
或者你更喜欢这个

int compare_info(char *array1, char *array2)
{
    int i;

    i = 0;
    if ((array1 == NULL) || (array2 == NULL))
        return 0;
    while ((array1[i] != '\0') && (array2[i] != '\0') && (array1[i] == array2[i]))
    {
        i++;
    }
    return (array1[i] == array2[i]);
}

您可以将参数设置为常量,因为如果您只想比较字符串,您可以保证函数不会修改它们,我的意思是
compare\u info(const char*array1,const char*array2)
这里有一个解决方案,很像您的代码,但我做了一些更改。我在循环的中间取出了回报,因为他们打破了结构,这样就更容易分析。完成后,我在while中添加了一个新条件,因此当找到字符串的结尾时,循环结束

int compare_info(char *array1, char *array2)
{
    int i;
    int response = 0;
    i = 0;

    while(array1[i] == array2[i] && response == 0 )
    {
        if(array1[i] == '\0' || array2[i] == '\0'){
            response = 1;
        }
        i++;
    }

    return response;
}

除了其他答案外,我还想在混合中添加以下内容,即没有strcmp的strcmp
strcmp
外观相似:

int strcmp_nohdr (char *s1, char *s2)
{
    if (!s1 && !s2) return 0;
    if (s1 && !s2) return 1;
    if (!s1 && s2) return -1;

    while (*s1 && *s2 && *s1 == *s2) s1++, s2++;

    if (!*s1 && !*s2) return 0;
    else if (*s1 > *s2) return 1;
    else return -1;
}
示例/输出:

$ strcmp_nohdr mydog mycat

 s1 is greater than s2

$ strcmp_nohdr mybat mycat

 s1 is less than s2

$ strcmp_nohdr mycat mycat

 s1 is equal to s2

$ strcmp_nohdr mycat myca

 s1 is greater than s2

$ strcmp_nohdr myca mycat

 s1 is less than s2
另一种选择是调用和汇编执行相同操作的例程。

很快:

int compare_info(char * array1, char * array2)
{
    char * ptr1 = array1;
    char * ptr2 = array2;

    while(*ptr1 && *ptr2 && *ptr1++==*ptr2++);
    if(!*ptr1 && !*ptr2 && *(ptr1-1)==*(ptr2-1)) return 0;
    return -1;
}

当两个数组相同时,返回0,否则返回-1。(它不等于strcmp。)

以下函数应模拟strcmp的确切行为:

int compare_info(const char* array1,const char* array2)
{
    int i;
    for (i=0; array1[i]!=0 && array2[i]!=0; i++)
    {
        if (array1[i] > array2[i])
            return +1;
        if (array1[i] < array2[i])
            return -1;
    }
    if (array1[i] != 0)
        return +1;
    if (array2[i] != 0)
        return -1;
    return 0;
}
int比较信息(常量字符*array1,常量字符*array2)
{
int i;
对于(i=0;array1[i]!=0和&array2[i]!=0;i++)
{
if(array1[i]>array2[i])
返回+1;
if(array1[i]
与某些人不同,我倾向于尽早捕获空指针(通过程序崩溃和调试器),因此我避免在下面检查空指针。换句话说,不要向这些函数传递空指针

str_neq
函数确定字符串是否不相等,这似乎是基于代码的正确逻辑(如果相等,则返回0/false;如果不相等,则返回-1/true):

要提供与strcmp相同的行为,需要在计算返回值的表达式中稍作更改:

int
str_compare (const char *s1, const char *s2)
{
  while (*s1 != '\0' && *s1 == *s2)
    ++s1, ++s2;
  return *s1 - *s2;
}

我希望这有帮助!:-)

问题是
c++
。你的第一个
while
是一个无限循环。比较
array1[i]
array2[i]
,但是
i
在循环中从不改变。在哪里定义
c
变量?编译它的时候?您的代码未编译。
strcmp()
如果第一个参数与第二个参数相比排序较低,则返回负值;如果第一个参数与第二个参数相比排序较高,则返回正值;如果它们相等,则返回零。比较返回0(正确)或-1(不总是正确)。
strcmp()
如果第一个参数与第二个参数相比排序较低,则返回负值;如果第一个参数与第二个参数相比排序较高,则返回正值;如果它们相等,则返回零。您的比较结果返回0(正确)或-1(不总是正确)。@JonathanLeffler他没有说他要模拟strcmp,他只是想要两个比较字符串,当字符串不匹配时,这将返回
0
,否则返回非零,转换此函数以返回类似于strcmp的值是很容易的,但是我认为这个答案解决了问题,当然,我可能是错的。初始检查NULL参数会导致函数返回“true”(通常定义为“not false”或0x01或0x02)这可能会对调用程序产生很大的误导,如果只有一个数组指针包含null,并且两个数组指针都包含null,那么这可能是不正确的NULL@user3629249我修好了。但我认为我仍然应该得到否决票。因为我没有考虑清楚。
strcmp\u nohdr(NULL,NULL)
会使事情崩溃,对吗?并不是说有人会傻到这样做…:-)你能给我解释一下这个密码吗S不能完全理解您在这里所说的。@Silvestrini显示的代码与
strcmp
的工作原理完全相同(除非
ptr>NULL
在该代码中被认为是正确的,如果
ptr
不是
NULL
)@ChronoKitsune看起来您确认了
中包含了
NULL,NULL
,如果(!*s1&!*s2)返回0s1&!s2
!当
s1
s2
均为
NULL
时,s1和&s2
为false。因此,代码在循环条件下继续执行
。由于两个指针都是
NULL
,因此您在
while
循环中意外地取消了对
NULL
指针的引用,这可能会导致崩溃。这只是个人偏好,但您可能还有另一个原因--
while(*s1!='\0'…
不仅仅是
while(*s1…
当指针前进到空终止符时,两个测试都是等效的。您为什么喜欢较长的版本?@DavidC.Rankin我更喜欢较短的版本,但为了清晰起见,我选择了较长的版本。op似乎更喜欢它。
int
str_compare (const char *s1, const char *s2)
{
  while (*s1 != '\0' && *s1 == *s2)
    ++s1, ++s2;
  return *s1 - *s2;
}