c - 我想从字符串中删除空格以检查它的palendrome,但它不断在C中添加字母
问题描述
我遇到的问题是代码在“for”代码之后不断添加字母,如果我写“ni pratar bra latin”,它将变成“nipratarbralatintin”,带有一个exta“tin”
int ret1;
int size = 0;
int i = 0;
char ch[100];
printf("WELCOME USER\n");
printf("ENTER A SENTENCE OR A WORD FOR THE PROGRAM TO START.\n");
printf("THE PROGRAM WILL CHECK IF YOUR SENTENCE / WORD IS A PALENDROME");
printf("\n");
scanf(" %[^\n]s", &ch);
删除空格,也就是我遇到问题的部分
for (i = 0, size = 0; i < strlen(ch); i++) {
ch[i - size] = ch[i];
if (ch[i] == ' ')
size++;
}
ch[i] = '\0';
ret1 = isPalindrome(ch);
int quit;
if (ret1 == 1)
// 1 means string is palendrome
printf("\nYOUR SENTENCE/WORD: %s IS A PALENDROME", ch);
else if (ret1 == 0)
// 0 means string is not palendrome
printf("\nYOUR SENTENCE/WORD: %s IS NOT A PALENDROME", ch);
解决方案
线
ch[i] = '\0';
是错的。该行没有意义,因为它\0
已经存在,ch[i]
因为它是在使用条件退出循环之后i < strlen(ch)
。
该行应该是
ch[i - size] = '\0';
保持与循环内行的一致性ch[i - size] = ch[i];
。
还有线
scanf(" %[^\n]s", &ch);
是错误的,因为在预期char(*)[100]
的地方传递并且调用了未定义的行为。char*
它应该是
scanf(" %[^\n]s", ch);
没有多余的&
。
这个带有检查的版本更好:
if (scanf(" %[^\n]s", &ch) != 1) {
fputs("read error\n", stderr);
/* exit program (return from main(), using exit(), etc. */
}
推荐阅读
- javascript - 捕获 v-for 循环的索引并将索引传递给函数
- python - 从区间列表中确定值的位置(综合解决方案)
- javascript - graphQL 查询中的字符串插值
- ruby-on-rails - nil 的未定义方法“匹配”:NilClass 在保存带有载波附件的对象时
- django - 在 Django 中为多个数据库创建路由器
- r - 加入互补数据帧,没有可用值的 NA
- haskell - 在递归类型上实现 monad
- c# - 如何简单地将表单数据从索引页面获取到索引类
- css - CSS样式表完成加载后如何运行函数
- node.js - Node JS - 尝试创建 PDF 时出现标题错误