(初学者)不知道为什么代码没有给出正确的输出

(Beginner) Don't know why code doesn't give correct output

首先,我尝试创建一个程序,它接受两个字符数组并从第一个数组中删除第二个数组中出现的任何字符。我添加了评论,以便更容易理解正在发生的事情。

   #include <stdio.h>

void rcfs(char s[], char t[]){
    int i=0, j=0;
    while (t[i] != '[=10=]')
        ++i; /*find size of t*/
    for (int x=0;x<i;++x){ /*go through both vals of x and
    check vals of s to see if they equal a val of x, if so set j of s to 0*/
        while (s[j]!=0){
            if (s[j]==t[x]){
                s[j]=0;
            }
            j++;
        }
        if (x<i-1)
            j=0;
    }
    char new[8]; /*new char arr to be assigned to s*/
    int x=0; //seperate counter that increments only when chars are added to new
    for (int q=0;q<j;q++){
        if (s[q]!=0)
            new[x++]=s[q];
    }
    new[7]=0;
    s=new; //maybe these need be pointers
}

int main(){
    char s[]="I eat food";
    char t[]="oe";
    printf("Pre: %s\n", s);
    rcfs(s, t);
    printf("Post: %s", s);
    return 0;
}

这是输出: 代替 'Post: I' 应该是: 'Post: I at fd' 总而言之,我得到了错误的输出,我目前不知道如何修复它。

开始于:

在函数rcfs外实例化char new[8],传给那个函数,在函数returns后打印:

char new[8];
rcfs(s, t, new);
printf("Post: %s", new);

函数当然应该声明为void rcfs(char s[], char t[], char new[])

我建议你把算法反过来,在外循环中循环 s。我还建议您使用 strlen 来查找字符串的长度,并使用 strchr 来查找字符串中是否存在字符。

示例:

#include <string.h>

void rcfs(char *s, char t[]) {   
    char *sw = s; // current writing position

    for(; *s != '[=10=]'; ++s)  {        // s is the current reading pos
        if(strchr(t, *s) == NULL) {  // *s is not in t
            *sw = *s;                // save this character at sw
            ++sw;                    // and step sw
        }        
    }

    *sw = '[=10=]'; // null terminate
}

Demo

你的做法是完全错误的。

例如这个 while 循环

    while (s[j]!=0){
        if (s[j]==t[x]){
            s[j]=0;
        }
        j++;
    }

如果您将某个前面的字符设置为 0,则可能无法找到等于字符 t[x] 的字符。

例如,如果 s = "12"t = "12" 那么在 for 循环的第一次迭代之后

for (int x=0;x<i;++x){

数组 s 看起来像 s = "" 因此 for 循环的第二次迭代中的 while 循环将由于条件

而立即退出
while (s[j]!=0){

这个带有幻数8

的字符数组的声明
char new[8];

没有意义。用户可以传递给函数任意长度的字符串。

在这个赋值语句中

s=new

指针类型char *的局部变量s(由于编译器将数组类型的参数调整为指向数组元素类型的指针) 由本地数组 new 的第一个元素的地址分配。这不会更改 main.

中声明的源数组 s

在不使用标准 C 字符串函数的情况下,您的函数可以按照下面的演示程序中所示的方式声明和定义。

#include <stdio.h>

char *rcfs( char s1[], const char s2[] )
{
    if (*s2)
    {
        char *src = s1, *dsn = s1;
        do
        {
            size_t i = 0;
            while (s2[i] != '[=15=]' && s2[i] != *src) ++i;
            if (s2[i] == '[=15=]')
            {
                if (src != dsn) *dsn = *src;
                ++dsn;
            }
        } while (*src++);
    }

    return s1;
}

int main( void )
{
    char s[] = "I eat food";

    printf( "Pre: %s\n", s );

    printf( "Post: %s\n", rcfs(s, "oe"));
}

程序输出为

Pre: I eat food
Post: I at fd