现在,我正在通过 Free Basic 进行编程,我正在寻找一种方法来获取数组的值。
例如,如果我想在一行中得到一个数组的2个整数,我写这个:
Dim a(2) as integer
Input a(1),a(2)
但我的程序应该从用户那里获得数组长度。
这是我的计划:
dim length as integer
input "Enter Array length: ",length
dim a(length) as integer
dim i as integer
for i=1 to length
input a(i)
next
'OTHER CODES...
但是这个程序在多行中获取数组值。问题就在这里。我想把它带到单行,但我不知道“我应该做什么?”
有人可以帮助我吗?
答案 0 :(得分:1)
你必须输入一个“字符串”,然后将字符串拆分为给定值的数量。
答案 1 :(得分:1)
是的。最好的方法可能是抓住整个字符串并自己解析数字。但为此,您需要使用line input
而不是input
,因为input
只会在第一个逗号之前返回字符串,其中line input
将返回整个字符串。
不幸的是,FreeBasic的弱点是字符串解析,因此您需要使用库或构建自己的函数来解析数字。这是一个例子:
declare sub explode_to_integers(s as string, a() as integer, delimiter as string=",")
sub explode_to_integers(s as string, a() as integer, delimiter as string = ",")
dim i as integer
dim idx as integer = 0
while len(s)
if idx > ubound(a) then
redim preserve a(idx) as integer
end if
i = instr(s, delimiter)
if i then
a(idx) = cast(integer, left(s, i-1))
s = right(s, len(s)-i)
else
a(idx) = cast(integer, s)
s = ""
end if
idx += 1
wend
end sub
你可以像这样使用它:
dim numbers as string
redim a() as integer
line input "Enter numbers: ", numbers
explode_to_integers(numbers, a()) '// split string by comma and put values into a()
dim i as integer
for i = 0 to ubound(a)
print a(i)
next i
end
确保在声明数组时使用redim
,因此可以在运行时调整数组大小。
答案 2 :(得分:1)
如果您的输入是所有数字(不带逗号)和/或文字没有引号,那么它非常简单:
Dim as integer x,x1,y,y1
Dim as string string1,string2
print "Be sure to use commas between values, if you need a comma in a string,"
print "use double quotes around the string."
Input "Enter x,x1,string1,y,y1,string2", x,x1,string1,y,y1,string2
如果您需要阅读大多数CSV文件,同样的技术也能很好地工作。
Input #filehandle, x,x1,string1,y,y1,string2
请注意,这不会处理字符串中的嵌入式引号,它会在第二个双引号处截断字符串,而不是在下一个未引用的逗号中截断。
换句话说,如果您:input #1, string1,x
,文件包含
"hello"world", 2
你只会得到你好,2回来。 (截至FB v 1.01) 我认为这是一个错误,因为你可以在其他地方使用嵌入式引号的字符串。
顺便说一句,编写CSV文件很容易使用:
Write #filehandle, x,x1,string1,y,y2,string2
希望这有帮助,我在其他几个地方看到了同样的问题。