c - 如果第二个参数完全包含在第一个参数中,它应该打印 true,但它打印 false
问题描述
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv){
char *str1, *str2;
int str1len, str2len;
str1 = argv[1]; str2 = argv[2];
str1len=strlen(str1);
str2len=strlen(str2);
if (str2len>str1len){
printf("false\n");
return 0;
}
char sub1[100];
for (int i=0;i<str1len-str2len;i++){
strncpy(sub1,str1+i,str2len);
if (strcmp(sub1,str2)==0){
printf("true\n");
}
printf("false\n");
return 0;
}
}
我不知道它的哪一部分是错误的,它不起作用。这是一个问题:一个程序将两个文本字符串作为参数,如果第二个字符串完全包含在第一个字符串中,则打印“true”后跟换行符,否则打印“false”后跟换行符。
解决方案
如果str1len
>= str2len
,当您这样做时,strncpy(sub1, str1+i, str2len)
它不会复制空终端字符。像这样在末尾添加一个。
strncpy(sub1, str1+i, str2len);
sub1[str2len] = '\0';
此外,索引是一个一个。如果您str2
恰好位于 末尾str1
,则不会被str1len-str2len
. 相反,它应该是
str1len-str2len+1
完成的代码为:
char sub1[100];
for (int i=0; i < str1len-str2len+1; i++){
strncpy(sub1, str1+i, str2len);
sub1[str2len] = '\0';
if (strcmp(sub1,str2) == 0){
printf("true\n");
return 0;
}
}
printf("false\n");
return 0;
推荐阅读
- laravel - Laravel 会话变量获取 Null,一旦重定向到支付网关并返回
- scala - 无法理解 Scala 的类型推断
- typescript - Typescript - 如何使用接口创建符合不同结构的新对象
- php - 带有自动登录/注销功能的 iframe 内的 Wordpress
- python - 在 Heroku 上发送 Django 电子邮件
- go - 如何使用 Go 在 Google Cloud Platform 上列出正在运行的实例
- excel - 如何在 VBA 中的 excel 中创建具有文件属性的动态对象列表
- typescript - 在 Typescript 中使用不同类型的 RxJS 扫描累加器和更新值
- tensorflow - 运行模型的一部分最简单的方法是什么?
- bash - UNIX 中 ` 和 $ 的区别