0

现在,我正在使用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...

但是这个程序在多行中获取数组值。问题正是在这里。我想把它放在一行中,但我不知道“我应该做什么?”

任何人都可以帮助我吗?

4

3 回答 3

1

您必须输入一个“字符串”,然后将字符串拆分为给定值的数量。

于 2012-02-15T13:55:43.227 回答
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

希望这会有所帮助,我在其他几个地方看到了同样的问题。

于 2015-01-23T07:39:29.657 回答
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,以便可以在运行时调整数组的大小。

于 2014-12-11T18:33:10.823 回答