嗨我有两个不同的字符串,我需要在字符串中找到常用字符。我设法获得了常见的字符串,但我需要返回" 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++;
}
}
}
}
答案 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;
}