C 为什么这个程序给变量j分配了一个奇怪的数字?

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

我在克尼汉和里奇第二版的书中学习C语言,目前正在读第二章。本章中的第五个练习要求读者“编写函数any(s1,s2),该函数返回字符串s1中出现字符串s2中任何字符的第一个位置,或者如果s1不包含s2中的任何字符,则返回-1。”

我做了我的计划,但我也去寻找其他人的答案,看看其他人对这个问题的态度。我在这里发现了这个程序

#包括
#定义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;
}