请用java编程:
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请用java编程:相关的知识,希望对你有一定的参考价值。
1.将一个千千静听中的歌词文件(.lrc)作为数据源,按行读入,并将每行歌词前的时间格式字符去掉(如:[00:00.62]),将歌名和歌词按行写入一个新文件中,文件名和歌词文件名相同,后缀名为txt;
参考技术A import java.io.BufferedReader;import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Lyric2Text
public void doWork(String lyric) throws IOException
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(lyric), "utf8"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(lyric.substring(0, lyric.lastIndexOf('.')) + ".txt"), "utf8"));
String line;
while((line = reader.readLine()) != null)
line = line.replaceAll("\\\\[[0-9:\\\\.]+\\\\]", "");
writer.write(line + "\\n");
reader.close();
writer.close();
public static void main(String[] args) throws IOException
Lyric2Text tmp = new Lyric2Text();
tmp.doWork("C:\\\\Users\\\\admin\\\\Desktop\\\\一帘幽梦.lrc");
请用指针解释数组[关闭]
【中文标题】请用指针解释数组[关闭]【英文标题】:Please explain arrays with pointers [closed] 【发布时间】:2017-02-06 08:49:18 【问题描述】:所以我是编程新手,我想了解我的教授在这个程序中使用指针。
#include <iostream>
using namespace std;
typedef int* IntPtr;
int main()
IntPtr p;
int a[10];
int i;
for(i = 0; i<10; i++)
a[i] = i;
p = a;
for(i = 0; i<10; i++)
cout << p[i]<< " ";
cout << endl;
输出: 0 1 2 3 4 5 6 7 8 9
根据我读到的'p = a'会将数组第一个元素的地址传递给'p'。所以我假设输出将全为零。但是当它打印时,它具有与数组“a”相同的元素。就像它把 a 的所有元素的地址传递给 p 一样。有人可以解释为什么。抱歉,如果我不能很好地解释这个问题,但我希望你明白我的意思。
【问题讨论】:
如果您是新手,请远离数组和指针,还有更重要的东西要学习。话虽如此,您是在说p = a;
,然后期望p
的行为与a
不同。为什么?
typedef int*
:( 为什么,哦,为什么你的教授会通过在 typedef 中隐藏指针来使程序更难理解。千万不要在实际程序中这样做,除非函数指针可能变得不可读否则。
【参考方案1】:
通过a[i]
或p[i]
访问元素,其中a
为数组类型,p
为指针类型,称为下标运算符,您可以阅读其语义,例如,@987654321 @:
... 表达式 E1[E2] 与表达式 *(E1 + E2)
完全相同
这意味着p[i]
与*(p + i)
相同,即它取消引用内存地址(p+i)
处的值,而i
使用sizeof(int)
正确计数,因为p
是指向@987654332 的指针@。如果p
指向a
,这与a[i]
完全相同,这又与*(a+i)
相同,其中a
衰减为指向数组a
中第一个元素的指针。
希望对你有帮助。
我希望你的教授教授指针、内存布局、解除引用等的含义。恕我直言,对指针和指针算术有信心是几个月(实际上是几年)的问题,而不是“教训”的问题。
【讨论】:
“我希望你的教授教授指针的含义……”——仅此一项对我来说就是一个很大的 +1。当然,您可能需要一些时间来学习并真正理解,但这几个月也可能是您在整个运营商中学到的最重要的东西。 感谢您的解释以及对我帮助很大的链接。刚开始用指针。起初我以为 p 有它自己的元素,现在我觉得很愚蠢,哈哈。我现在完全明白了。【参考方案2】:实际上很遗憾没有向学生解释内存管理的工作原理......
如果你分配一些东西,它最终会成为一块连续的内存。也就是说:如果你分配一个数组,它就是一个连续内存块中的字节序列。
指针只不过是一小块内存(通常是 4 或 8 个字节),其中包含其他东西的地址。例如。它指向数据。
本例中的数组是一个字节序列,因为 int 有 4 个字节,所以它是 40 个字节。取消引用数组中的元素意味着读取索引 X 处的整数。(换句话说:读取从 X*4 到但不包括 (X+1)*4 的 4 个字节——或更准确地说:[X*4, (X+1)*4>
)。
使用指针意味着读取地址指向的内容。在这种情况下,指针包含数组第一个元素的地址,因此读取*p
意味着读取数组的前 4 个字节。它是p[0]
的同义词。
这基本上是可行的,因为数组中的数据是连续存储的,并且没有数据被复制。因此,如果您编写a[2] = 2
,它只会将名为您的数组的内存块中的字节 2*4 覆盖到 (2+1)*4(更准确地说:[2*4, (2+1)*4>
)。它不会复制,更改p
中的地址或其他任何内容。
PS:需要注意的一个重要细节是,在 C++ 中分配诸如整数数组之类的东西并不意味着将 everyting 设置为 0。它只是分配了一块具有正确类型的内存。仅此而已。
【讨论】:
只是有点吹毛求疵:“字节 X*4 到 (X+1)*4”总共是 5 个字节而不是 4。稍后当您说“将字节 2*4 覆盖到 (2 +1)*4" 这将是一个字节对多个 @tobi303 嗯,我不是以英语为母语的人,所以我不确定……只是为了确定,'to' 是专有的,对吗? (它是荷兰语)[X*4, (X+1)*4>
在这种情况下是正确的。
不是官方参考,但这也是我理解英语“从...到...”(包括)english.stackexchange.com/a/7872
@tobi303 谢谢,从来不知道;我会记住的。做了一些更改,希望您现在可以批准 :-)
整数数组的初始化实际上意味着设置所有元素。我认为您的意思是数组的 allocation 不一定会执行初始化。以上是关于请用java编程:的主要内容,如果未能解决你的问题,请参考以下文章
用java编程 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
用java编程 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。