C 为什么这个程序给变量j分配了一个奇怪的数字?
我在克尼汉和里奇第二版的书中学习C语言,目前正在读第二章。本章中的第五个练习要求读者“编写函数any(s1,s2),该函数返回字符串s1中出现字符串s2中任何字符的第一个位置,或者如果s1不包含s2中的任何字符,则返回-1。” 我做了我的计划,但我也去寻找其他人的答案,看看其他人对这个问题的态度。我在这里发现了这个程序C 为什么这个程序给变量j分配了一个奇怪的数字?,c,for-loop,kernighan-and-ritchie,C,For Loop,Kernighan And Ritchie,我在克尼汉和里奇第二版的书中学习C语言,目前正在读第二章。本章中的第五个练习要求读者“编写函数any(s1,s2),该函数返回字符串s1中出现字符串s2中任何字符的第一个位置,或者如果s1不包含s2中的任何字符,则返回-1。” 我做了我的计划,但我也去寻找其他人的答案,看看其他人对这个问题的态度。我在这里发现了这个程序 #包括 #定义MAXLINE 1000 int-mgetline(字符行[],int-maxline); int any(字符s1[],字符s2[]); 内部主(空) { 字符s
#包括
#定义MAXLINE 1000
int-mgetline(字符行[],int-maxline);
int any(字符s1[],字符s2[]);
内部主(空)
{
字符s1[MAXLINE],s2[MAXLINE];
int-val;
/*给出第一个字符串s1*/
mgetline(s1,最大线);
/*给第二个字符串s2*/
mgetline(s2,最大线);
val=任何(s1,s2);
printf(“%d”,val);
返回0;
}
int mgetline(字符s[],int lim)
{
int i,c;
对于(i=0;i新行字符“\n”也被视为要比较的字符。根据您的程序,每个字符串都应该有新行字符,并且在第一个字符串的末尾以任何方式匹配。我通过注释掉这两行来修复此问题
//if(c=='\n')
// s[i++]=c;
这是更新的程序
#include<stdio.h>
#define MAXLINE 1000
int mgetline(char line[],int maxline);
int any(char s1[],char s2[]);
int main(void)
{
char s1[MAXLINE],s2[MAXLINE];
int val;
/* Give the first string s1 */
mgetline(s1,MAXLINE);
/* Give the second string s2 */
mgetline(s2,MAXLINE);
val = any(s1,s2);
printf("%d",val);
return 0;
}
int mgetline(char s[],int lim)
{
int i,c;
for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)
s[i]=c;
//if(c=='\n')
// s[i++]=c;
s[i]='\0';
}
int any(char s1[],char s2[])
{
int i, j, check_next_char;
check_next_char = 1;
for(i = 0; s1[i] != '\0' && (check_next_char);)
{
// iterate through s2 while trying to find matching character from s1
for(j = 0; s2[j] != '\0' && (s1[i] != s2[j]); ++j)
; // continue
if(s2[j] == '\0') {
check_next_char=1;
i++; // go for the next char in s1
}
else
check_next_char=0; // match found
}
if(s1[i] == '\0')
return -1;
else
return i;
}
#包括
#定义MAXLINE 1000
int-mgetline(字符行[],int-maxline);
int any(字符s1[],字符s2[]);
内部主(空)
{
字符s1[MAXLINE],s2[MAXLINE];
int-val;
/*给出第一个字符串s1*/
mgetline(s1,最大线);
/*给第二个字符串s2*/
mgetline(s2,最大线);
val=任何(s1,s2);
printf(“%d”,val);
返回0;
}
int mgetline(字符s[],int lim)
{
int i,c;
对于(i=0;我知道你是否尝试在调试器中运行它并逐步执行?这将揭示这些数字来自何处?你打算保留换行符吗?我这样问是因为写下来的话,如果没有其他匹配的话,这将始终是匹配的。@EugeneSh。我确实在调试器中运行过它,这就是我如何注意到j变量的奇怪值的原因。我的意思正是我想要的said:ex:s1=abcd\n
,s2=efgh\n
。通过保留换行符,换行符不是零,并且将匹配,因此您的任何
函数将永远不会返回-1
。确保这一点,请暂时忘记j
。您的代码是否确实为您想要的给定输入生成了输出s我刚刚展示了结果将打印4
@WhozCraig我明白你现在说的,你是对的。正如你所说的那样发生了。非常感谢你的帮助。我实际上调试了很多次,但对\n字符一无所知。我对我的代码有偏见,这与我发布的代码类似,但没有保留\n字符。
#include<stdio.h>
#define MAXLINE 1000
int mgetline(char line[],int maxline);
int any(char s1[],char s2[]);
int main(void)
{
char s1[MAXLINE],s2[MAXLINE];
int val;
/* Give the first string s1 */
mgetline(s1,MAXLINE);
/* Give the second string s2 */
mgetline(s2,MAXLINE);
val = any(s1,s2);
printf("%d",val);
return 0;
}
int mgetline(char s[],int lim)
{
int i,c;
for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)
s[i]=c;
//if(c=='\n')
// s[i++]=c;
s[i]='\0';
}
int any(char s1[],char s2[])
{
int i, j, check_next_char;
check_next_char = 1;
for(i = 0; s1[i] != '\0' && (check_next_char);)
{
// iterate through s2 while trying to find matching character from s1
for(j = 0; s2[j] != '\0' && (s1[i] != s2[j]); ++j)
; // continue
if(s2[j] == '\0') {
check_next_char=1;
i++; // go for the next char in s1
}
else
check_next_char=0; // match found
}
if(s1[i] == '\0')
return -1;
else
return i;
}