C编程 - 函数squeeze(s1,s2)删除s1中与s2中的字符匹配的每个字符

时间:2017-01-12 16:27:05

标签: c

所以这是我创建的程序:

from tkinter import Tk, Text, Scrollbar

root = Tk()
# only the column containing the text is resized when the window size changes:
root.columnconfigure(0, weight=1) 
# resize row 0 height when the window is resized
root.rowconfigure(0, weight=1)

txt = Text(root)
txt.grid(row=0, column=0, sticky="eswn")

scroll_y = Scrollbar(root, orient="vertical", command=txt.yview)
scroll_y.grid(row=0, column=1, sticky="ns")
# bind txt to scrollbar
txt.configure(yscrollcommand=scroll_y.set)

very_long_list = "\n".join([str(i) for i in range(100)])

txt.insert("1.0", very_long_list)
# make the text look like a label
txt.configure(state="disabled", relief="flat", bg=root.cget("bg"))

root.mainloop()

这个程序根本不起作用。我真的找不到任何错误。但是,当我将for循环更改为:

#include <stdio.h>
#include <stdlib.h>

void squeeze_1(char s[],char q[])
{
    int i, j, k;

    for (k=0; q[k] != '\0'; k++)
    {
        for ( i = j = 0; s[i] != '\0'; i++, j++)
        {
            if (s[i] != q[k])
                s[j] = s[i];
        }
    }
    s [j] = '\0';
    return 0;
}

void main (void)
{
    char s[] = "I hate computer science";
    char q[] = "co";

    squeeze_1(s,q);
    printf("%s", &s);
    return 0;
}

我将获得**几乎正确的输出,这是“我讨厌电脑scienence”这正是输出。我不确定“enen”来自哪里......

如果你们中的任何一个人能告诉我自己做错了什么就会很棒。

2 个答案:

答案 0 :(得分:0)

请注意,for循环总是递增j,以便\0将保留在完整数组的末尾,而不是放在压缩数组的末尾

for ( i = j = 0; s[i] != '\0'; i++, j++)

表示如果s[i] == q[k]并且未将其复制到s[j],那么j应递增(但无论如何都会增加它)。这就是你在几乎可以工作的版本中所做的事情。但是,因为你从0开始j(用i)然后它应该是

for ( i = j = 0 ; s[i] != '\0' ; i++)
{
    if (s[i] != q[k])
    {
        s[j++] = s[i];
        s[j] = `\0`
    }
 }

这样做也会将\0放在正确的位置。

你可能还有一个更好的循环

#include <stdlib.h>

void squeeze_1(char s[],char q[])
{
    int i, j, k;
    int found = 0;

    for ( i = j = 0; s[i] != '\0'; i++, j++)
    {
        for (k=0; q[k] != '\0'; k++)
        {
            if (s[i] == q[k])
                found = 1
        }
        if (!found)
        {
            s[j++] = s[i];
            s [j] = '\0';
        }
    return 0;
}

答案 1 :(得分:0)

在复制完所有非匹配字符后,您必须先结束字符串

在(内部) for 循环之后,添加

s[j] = '\0';

这给了

for ( i = j = 0 ; s[i] != '\0' ; i++)
{
    if (s[i] != q[k])
        s[++j] = s[i];
}

s[j] = 0; // <=== here