- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
好吧,我不确定这是我还是其他什么人,但我真的很困惑。
我试图找到一个字符串在另一个字符串中的第一次出现(就像 C++ 中的 InString() 一样),但是是从 C 中使用 strcmp() 来完成的。
我有两个字符数组,string[] 和 toFind[],我在两个 for() 循环中遍历它们,将每个字符与 strcmp() 进行比较。
代码如下:
int inString(char string[], char toFind[]){
int i_toFind, i_string, check = 0, start = -1;
for(i_toFind = 0; i_toFind < getLength(toFind)-1; i_toFind++){
for(i_string = 0; i_string < getLength(string)-1; i_string++){
if(strcmp(&string[i_string], &toFind[i_toFind])==0){
printf("%i & %i == %i\n", string[i_string], toFind[i_toFind], strcmp(&string[i_string], &toFind[i_toFind]));
if(start == -1){
start = i_string;
}
check++;
i_toFind++;
if(check == getLength(toFind)-1){
return start;
}
}
else{
printf("%i & %i == %i\n", string[i_string], toFind[i_toFind], strcmp(&string[i_string], &toFind[i_toFind]));
check = 0;
start = -1;
}
}
}
return -1;
}
现在这适用于这个值的例子:
string[] = "hello my friend"
toFind[] = "friend"
result:
104 & 102 == 2
101 & 102 == -1
108 & 102 == 6
108 & 102 == 6
111 & 102 == 9
32 & 102 == -70
109 & 102 == 7
121 & 102 == 19
32 & 102 == -70
102 & 102 == 0
114 & 114 == 0
105 & 105 == 0
101 & 101 == 0
110 & 110 == 0
100 & 100 == 0
但这是行不通的:
string[] = "friday friend comes"
toFind[] = "friend"
result:
102 & 102 == -1
114 & 102 == 12
105 & 102 == 3
100 & 102 == -2
97 & 102 == -5
121 & 102 == 19
32 & 102 == -70
102 & 102 == 22
114 & 102 == 12
105 & 102 == 3
101 & 102 == -1
110 & 102 == 8
100 & 102 == -2
32 & 102 == -70
99 & 102 == -3
111 & 102 == 9
109 & 102 == 7
101 & 102 == -1
115 & 102 == 13
102 & 114 == -12
114 & 114 == -1
105 & 114 == -9
...
有趣的部分是:
102 & 102 == -1
114 & 114 == -1
相等时不应该为0吗?或者我在这里错过了什么?如果我正在搜索的词不是字符串 [] 中的最后一个词,我编写的函数似乎只会失败。
希望有人能真正发现我的错误。谢谢!
更新:
我运行 InString() 的代码只有一行:
printf("Beginn: %i\n", inString(string, substring));
更新 2:
这是一个简单的问题示例:
int inString(char string[], char toFind[]){
const char *pointer_toStart = strstr(string, toFind);
return pointer_toStart ? pointer_toStart - string : -1;
}
int main(int argc, const char * argv[]) {
char string[300], substring[300];
printf("String: ");
fgets(&test, 20, stdin); // To capture the one '\n' inside the buffer (just ignore this line)
fgets(string, 300, stdin);
printf("toFind: ");
fgets(substring, 300, stdin);
printf("Beginn: %i\n", inString(string, substring));
}
最佳答案
您不能使用 strcmp
要比较 C 字符串的部分,您可以使用 memcmp
为了那个原因。但是使用 strstr
可以更简单地解决您的问题.
根据您的隐式规范,这是 inString 的简单实现。
#include <string.h>
int inString(const char *string, const char *toFind) {
const char *p = strstr(string, toFind);
return p ? p - string : -1;
}
该函数返回子字符串的起始索引(如果找到)和 -1
如果没有找到。
使用此实现,以下测试正确打印 25
:
#include <stdio.h>
int main(void) {
char string[] = "Friede freude Eierkuchen freuen sich freundlich";
char toFind[] = "freuen";
printf("inString(\"%s\", \"%s\") -> %d\n", string, toFind, inString(string, toFind));
return 0;
}
在您的测试代码中,您使用 fgets
从标准输入读取字符串。两个字符串都可能包含最后一个 '\n'
因此您找不到 "freuen\n"
的匹配项除非它在 string
的末尾还有一个最终的 '\n'
.通过删除 '\n'
来更正此问题.这是一种剥离它的简单方法,如果它不存在也可以使用:
string[strcspn(string, "\n")] = '\0';
toFind[strcspn(toFind, "\n")] = '\0';
关于C strcmp 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33857308/
我想知道如果在同一个函数中多次使用 strcmp() 会返回不同的值。下面是程序。第一种情况我知道它为什么打印 -6。但是在第二种情况下,为什么会打印-1呢? #include #include in
所以我们在 PHP 中得到了这个函数 strcmp(string $1,string $2) // returns -1,0, or 1; 然而,我们没有 intcmp();所以我创建了一个: fun
我正在比较用户输入的用户名和密码。正在比较的字符串正在从文件中读入。无论出于何种原因,它都会适当地比较用户名,而不是密码。。控制台输出:
我正在比较用户输入的用户名和密码。正在比较的字符串正在从文件中读入。无论出于何种原因,它都会适当地比较用户名,而不是密码。。控制台输出:
虽然 word 和 s2 相同,但是 if(strcmp) 语句没有被执行。错在哪里??我检查了从文件中读取的代码并尝试了“printf”以查看 word 和 s2 是否相同,发现它们在大约 10 次
是不是只有静态存储类型的变量不会被函数的返回值初始化,因为它们不被认为是常量?根据这个论点,以下声明在 C 中是否有效。它编译时没有错误或警告, 并且输出符合预期。 #include #includ
我必须生成一个反向链表,这些是我的先决条件 定义结构: struct node { int data; struct node * link; } 包含函数 append --- 在链
我是 C 编程的新手。我正在尝试比较两个字符串。我收到错误:此行有多个标记。传递 'strcmp' 的参数 1 使指针来自整数而不进行强制转换。传递 'strcmp' 的参数 2 使指针来自整数而不进
请注意,我已经检查了与此标题相关的问题,但从我的角度来看,它们与此问题无关。 最初我以为 program1 和 program2 会给我相同的结果。 //Program 1 char *a = "ab
你好,我正在使用 fgets 对我的代码进行循环,我希望当用户引入单词 "bye" 时程序结束,所以我有一个像这样的时间: char buf[1000] do{ fgets(buf, 1000
我想了解为什么我的代码会崩溃。我有一个结构数组,如下所示: typedef struct contact { char cFirstName[10]; char cLastName[1
代码: #include #include #include int main() { int n = strcmp("hello","help"); printf("%d\
这个问题在这里已经有了答案: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized po
该程序执行以下操作: 扫描文本字符串char input[15]; 将其与字符密码[ ] = "1sure";进行比较 如果字符串不匹配则循环。 如果字符串匹配则终止。 当字符串不匹配时程序会循环。但
我正在读一本 C 语言的书,并且看过这两个 strcmp 算法。 我已经了解了 for 循环的使用原理。 但这两个for循环对我来说是新的。我不明白这些部分 for (i = 0; s[i] == t
用 gcc C99 编译 我正在尝试使用字符串比较来比较 2 个字符串。但是,我似乎在 strcmp 行上得到了堆栈转储。 **属性将包含这些,所以我正在寻找框架类型。 [name] [time] [
我正在努力填补计算机科学方面的自学空白,并参加 Edx 上的 CS50 类(class)。我对 C 完全陌生。在其中一个问题集中,我必须比较使用 crypt 函数加密的字符串。 在下面的示例中,我无法
谁能解释一下 strcmp 在 C 编程中使用什么算法来比较两个字符串? 我不明白它的返回值,它使用任何算法,如“Levenstien 算法”来找出两个字符串之间的距离... 最佳答案 标准 C 库
我在结构数组 books 上有一个delete 函数。我向它传递了一组记录、书的作者 和书名 以及列表大小。 现在这里 假设 list[0].author 和 list[5].author 和 aut
这个问题已经有答案了: using fgets and strcmp in C [duplicate] (3 个回答) 已关闭 4 年前。 作为初学者,我一直在尝试该库的一些功能 string.h并且
我是一名优秀的程序员,十分优秀!