该程序将 1 个参数作为子字符串,然后是字符串。如果后续行中有子字符串,则需要显示此行以及其中子字符串的出现次数:
#include <stdio.h>
char *sub_string(const char *str, const char *s_str); /*str - строка, s_str - подстрока*/
int main(int argc, char **argv)
{
int i, count, ssl;
char *str;
argv++;
if(argc < 2){
fprintf(stderr, "Incorrect args\n");
return 1;
}
for(ssl = 0; (*argv)[ssl]; ssl++); /*ssl = (длина подстроки с '\0' символом) - 1*/
puts("Args with substring:");
for(i = 1; argv[i]; i++){
count = 0;
str = argv[i];
while(sub_string(str, *argv)){
count++;
str += ssl;
}
if(count > 0)
printf("%s, substring's count: %d\n", argv[i], count);
}
return 0;
}
char *sub_string(const char *str, const char *s_str)
{
char *str_ptr, *s_str_ptr;
int trigger;
while(*str){
if(*str == *s_str){
trigger = 1;
str_ptr = str;
s_str_ptr = s_str;
while(*str_ptr && *s_str_ptr){
trigger &= (*str_ptr == *s_str_ptr);
str_ptr++;
s_str_ptr++;
}
if(trigger && !(*str_ptr) && *s_str_ptr)
return NULL;
if(trigger)
return str;
}
str++;
}
return NULL;
}
问题:
当我使用以下参数调用程序时:./prog "asd" "1asd2asd3asd"它给了我1asd2asd3asd, substring's count: 4. 为什么???
如果在一个循环中
while(sub_string(str, *argv)){
printf("%s\n", sub_string(str, *argv));
count++;
str += ssl;
}
добавить printf("%s\n", sub_string(str, *argv));
那么输出将是:
asd2asd3asdd
asd3asdd
asdd
asdd
为什么有asdd两次???3 次迭代后,d 应该保留并且函数应该返回 NULL,但它似乎又需要 asdd ...
当我打电话时,./prog "asd" "1asd2asdd"它给了我1asd2asdd, substring's count: 2。怎么了?我不明白前面的(和类似的例子)的例子有什么问题......这里Printf循环中的同一个例子会给出
asd2asdd
asdd
也就是说,一切都是应有的。我已经累了,胡说八道)))
我将回答第一个问题 - 为什么它会找到 4 行。一切都非常简单,极其简单。事实上,您的代码正在查看是否存在从字符串开头开始的字符串。如果找到,它会添加子字符串的长度并再次检查。取原始字符串“1asd2asd3asd”。显然,从字符串的开头有一个子字符串 asd。现在我们移动了 3 个字符(asd 的长度),我们有了字符串“d2asd3asd”(也在那里)。然后我们继续前进并有“sd3asd”(再次找到),最后一次迭代给出“asd”,你瞧——又找到了。这就是来龙去脉。该怎么办?有几个选项,但最简单的是简单地检查找到的子查询的位置并添加它。那就是它所在的地方
但也许,如果要搜索的子字符串是adad,而我们要去的字符串是adadad,那么我们仍然需要仔细考虑正确答案应该是什么。我仍然得到 1,尽管有人可能会说应该有两个。但这很容易通过更换线路来解决
每行
如何正确地做取决于你。
我试图用最少的编辑来修复代码。一般来说,搜索功能中会有一些臭代码——比如这一行
str_ptr = str;——在左边——char*,在右边——const char*。