Онлайн компилятор C

#include <stdio.h> int main() { char s1[1001],s2[1001]; fgets(s1,1001,stdin); fgets(s2,1001,stdin); int i=0; while(s1[i]!='\0') i++; if(s1[i-1]=='\n') s1[i-1]='\0'; i=0; while(s2[i]!='\0') i++; if(s2[i-1]=='\n') s2[i-1]='\0'; int ix=0; while(s1[ix]!='\0'&&s2[ix]!='\0') { if(s1[ix]!=s2[ix]) { printf("%d",ix); return 0; } ix++; } if(s1[ix]=='\0'&&s2[ix]=='\0') { printf("-1"); } else { printf("%d",ix); } return 0; }
这段代码的功能是比较两个字符串,找出它们第一个不同字符的位置(从0开始计数)。如果两个字符串完全相同,则输出-1。代码首先用fgets读取两行输入,然后手动去掉末尾可能存在的换行符,接着逐个字符比较。

- 代码中有一个潜在问题:当两个字符串长度不同时,比较循环会在较短的字符串结束时停止,但此时ix指向的是较短字符串的结束位置。如果较长的字符串在该位置有字符,那么输出这个位置是正确的。但如果较短的字符串结束位置恰好是较长字符串的结束位置(即较长字符串也刚好在这个位置结束),那么会进入最后的if-else判断。你需要检查这个判断逻辑是否覆盖了所有情况,特别是当两个字符串长度不同但其中一个在另一个的末尾处结束的情况。

- 另外,注意fgets会读取换行符,代码中手动去掉了换行符。但如果你输入的字符串长度正好是1000个字符(不包括换行符),那么fgets会读取1000个字符加上换行符,但数组大小是1001,所以换行符会被读入。这种情况下,去掉换行符的逻辑是没问题的。但如果输入字符串长度超过1000,fgets会只读取前1000个字符,不会读入换行符,此时s1[i-1]就不是换行符,代码不会错误地去掉一个有效字符。这一点目前是正确的。