所以这是我创建的程序:
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”来自哪里......
如果你们中的任何一个人能告诉我自己做错了什么就会很棒。
答案 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