我试着写一个程序,其中缓冲区应该是固定大小。修正后我的意思是上限是固定的。程序应该将第一个元素移位数组向左移除1,将新元素移除到缓冲区数组的末尾。
实施例: 输出应该是:1234 2345 3456其中最后一位是输入
这就是我试过的
#! /usr/bin/python
#
# From https://stackoverflow.com/questions/797771/python-protected-attributes
from __future__ import print_function
import sys
class Stock(object):
def __init__(self, stockName):
# '_' is just a convention and does nothing
self.__stockName = stockName # private now
@property # when you do Stock.name, it will call this function
def name(self):
print("In the getter, __stockName is %s" % self.__stockName, file=sys.stderr)
return self.__stockName
@name.setter # when you do Stock.name = x, it will call this function
def name(self, name):
print("In the setter, name is %s will become %s" % ( self.__stockName, name), file=sys.stderr)
self.__stockName = name
if __name__ == "__main__":
myStock = Stock("stock111")
try:
myStock.__stockName # It is private. You can't access it.
except AttributeError as a:
print("As expect, raised AttributeError", str(a), file=sys.stderr )
else:
print("myStock.__stockName did did *not* raise an AttributeError exception")
#Now you can myStock.name
myStock.name = "Murphy"
N = float(input("input to your stock: " + str(myStock.name)+" ? "))
print("The value of %s is %s" % (myStock.name, N) )
答案 0 :(得分:1)
你的程序中的第一个问题是这个陈述:
scanf("%c",&ch);
当您输入字符并按“Enter”键时,按“Enter”键后,'\n'
字符仍然留在输入流中,下一次调用scanf
,在您的无限{ {1}}循环将使用它,ch的下一个值将是while
个字符。
要解决此问题,请在格式字符串中的转换说明符前添加一个空格:
\n
第二个问题是这句话:
scanf(" %c",&ch);
这在逻辑上是不正确的。
由于memmove(&buffer[idxToDel], &buffer[idxToDel + 1], strlen(buffer) - idxToDel);
值为0,因此idxToDel
会尝试将memmove
(= 4)字节从源strlen(buffer) - 0
移至目标&buffer[0 + 1]
(衰败到&buffer[0]
)。但在你的情况下,你只需要移动3个字符。
buffer
函数不会检查源中的任何终止空字符 - 它总是复制完整的字节数。
所以,你可以这样做:
memmove()