查找字符串

时间:2017-10-06 08:10:48

标签: c string function

嗨我有两个不同的字符串,我需要在字符串中找到常用字符。我设法获得了常见的字符串,但我需要返回" null string"对于没有相同字符的输入。

当前问题:

input1:abc
input2:def
输出:' //它应该是"空字符串&#34 ;;

继承我的代码:

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

void strInterset(char * str1, char * str2, char * str3);

int main() {
    char str1[50], str2[50], str3[50];

    printf("Enter str1: \n");
    scanf("%s", str1);
    printf("Enter str2: \n");
    scanf("%s", str2);
    strInterset(str1, str2, str3);

    if (*str3 == '\0')
        printf("strIntersect(): null string\n");
    else
        printf("strIntersect(): %s\n", str3);

    return 0;
}

void strInterset(char * str1, char * str2, char * str3) {
    int i = 0, j;
    for (i; *(str1 + i) != '\0'; i++) {
        for (j = 0; *(str2 + j) != '\0'; j++) {
            if ( *(str2 + j) == *(str1 + i)) {
                strcpy(str3, str1 + i);
                str3++;
            }
        }
    }
}

5 个答案:

答案 0 :(得分:1)

原因是JavascriptExecutor只有在找到匹配项时才会调用WebElement ele = driver.findElement(By.xpath("element_xpath")); JavascriptExecutor executor = (JavascriptExecutor)driver; executor.executeScript("arguments[0].click();", ele); ,并且不会修改strInterset()或其指向的数据。修复很简单 - 在strcpy()循环之前添加语句

str3

如果找到匹配项,仍会调用strInterset()。如果没有,则 *str3 = '\0'; 中的测试将成功。

strcpy()中的数组初始化为零也适用于main()的第一次调用。它可能不适用于后续调用(除非main()在每次调用之前重新初始化strInterset()。因此,最好在main()中进行初始化。

答案 1 :(得分:0)

通过将其声明为

,将str3明确初始化为NULL
char str3[50] = { NULL }; 

如果你不这样做,那就是一个带有垃圾/不确定值的单元化数组。

答案 2 :(得分:0)

您应该将str3初始化为NULL,如下所示:

char str3[50] = {0};

因为如果你不这样做,它将保持一个单元化数组,这意味着它将在访问时调用 Undefined Behavior ,因为它的值是垃圾。

此外,即使存在共同字符,str3也不会以NULL结尾。

我个人会将你的功能改为:

void strInterset(char * str1, char * str2, char * str3) {
    int i = 0, j;
    *str3 = '\0'; // NULL terminate
    for (i; *(str1 + i) != '\0'; i++) {
        ...
}

输出:

Enter str1: abc
Enter str2: dfg
strIntersect(): null string

PS:编译并启用警告,您将获得:

prog.c: In function 'strInterset':
prog.c:26:5: warning: statement with no effect [-Wunused-value]
     for (i; *(str1 + i) != '\0'; i++) {
     ^~~

只需将其更改为:for (; *(str1 + i) != '\0'; i++) {,甚至更好for (int i = 0; *(str1 + i) != '\0'; i++) {。这不是你的问题,但最好修好警告。

答案 3 :(得分:0)

快速修复应该str3[0] = '\0'作为main中的第二行。

但是有更多方法可以让您的计划更好:

  • 为什么你需要一个完整的char str3[50]?您可以改为使用函数的返回值,如下所示:char strInterset(char * str1, char * str2);然后在适当的位置添加return。 (顺便说一句:应该是拼写intersect?)

  • 您的程序使用两个嵌套的for - 循环(在大输入时速度很慢)。相反,您可以创建一个数组,其中每个条目对应一个字符值(查看ascii表)。然后,数组可以包含字符出现的真/假。将所有条目初始化为0.然后运行第一个字符串,对于每个字符,将其在数组中的条目设置为1.然后运行第二个字符串,对于每个字符,检查数组中的条目是否为 1.如果找到这种情况,那么你会发现两个字符串中都出现了一个字符。

答案 4 :(得分:0)

这是您的函数,它检查公共字符并将它们添加到结果字符串而不重复。如果你不关心重复,只需删除第二个if(只有if所在的行,但将其主体留在括号中)

char *strcomm(const char *s1, const char *s2, char *s3)
{
    const char *tmp;
    char *tmps3 = s3;
    *s3 = 0;
    while(*s1)
    {
        tmp = s2;
        while(*tmp)
        {
            if(*s1 == *tmp)
                if(strchr(s3,*s1) == NULL)
                {
                    *s3++ = *s1;
                    *s3 = 0;
                }
            tmp++;
        }
        s1++;
    }
    return tmps3;
}