我正在开发一个MediaPlayer项目,该项目将播放文本文件而不是音频或视频。我的问题是如何在C字符串数组中显示字符串?例如,如果在文本文件中我有(没有引号):
**"This is only test"**
并且我的程序我希望一次只显示一个单词,如:
This
is
only
test
我该怎么做?到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Global variables
int position=0; //to set the player position
float rate = 1.0; //the rate of playback
void LoadFile(const char *fileName, char *text){
FILE *ifp; //a file pointer for file read/write
//opening the file
ifp = fopen(fileName, "r");
if(ifp == NULL){
fprintf(stderr, "Can't open input file \"%s\"!\n",fileName);
exit(1);
}
else{
fgets(text,50,ifp); //getting the text from the file
}
//closing the file
fclose(ifp);
}
void *Start();
void *Stop();
void Rewind();
void SeekTo(int byteOffset);
void setRate(float rate);
int main(void){
int i = 0;
char choice;
char fileName[25];
char lineOfText[50]; //holds the text inside the file
printf("Please enter the file you want to open: ");
scanf("%s", fileName);
LoadFile(fileName,lineOfText);
printf("%s",lineOfText); //I will display the whole string
return 0;
}
答案 0 :(得分:1)
由于您使用的是C ++,因此您可以使用Boost轻松完成此操作。从文件中读取该行后,您可以构建string
,然后使用boost::split
:
string line(text);
vector<string> words;
split(words, line, is_any_of(" "));
之后,您可以遍历vector
获取从文件中读取的单个单词。例如,为了顺序打印所有单词(使用C ++ 11语法):
for (const auto& w : words)
cout << w << endl;
此外,您可能还想考虑将程序移植到真正的 C ++。为此,您需要使用string
而不是char
数组,使用ifstream
来读取文件等。
答案 1 :(得分:1)
使用strtok功能
#include < stdio.h >
#include < string.h >
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
//printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
此代码将提供输出
This
a
sample
string
进一步了解请转到以下
答案 2 :(得分:0)
可能重新发明轮子,但偶尔也有用:
// substring_container_adapter.h
//
// substring_container_adapter is useful for treating a single master string as a collection of substrings
// for the purpose of enumerating over those substrings (read-only)
//
// NOTES:
// (1) sequential forward access is reasonably efficient, but random access is definitely not very efficient. (bidirectional could be implemented)
// (2) the strings must be valid for the lifetime of the adapter and any enumerators you obtain from the adapter
// (3) uses a greedy algorithm - so whole sequences of delimiters are considered one separator, rather than multiple separators
namespace details
{
template <typename charT>
class substring_container_adapter
{
public:
struct iterator : public std::iterator<std::forward_iterator_tag, const charT *>
{
// iterator constructor
iterator(const charT * pszPosition, const charT * pszDelimeters)
: m_pszPosition(pszPosition)
, m_pszDelimeters(pszDelimeters)
, m_pszEnd(FindOneOfOrNil(pszPosition, pszDelimeters))
{ }
// supported relational operators
bool operator == (const iterator & rhs) const { return m_pszPosition == rhs.m_pszPosition; }
bool operator != (const iterator & rhs) const { return m_pszPosition != rhs.m_pszPosition; }
bool operator < (const iterator & rhs) const { return m_pszPosition < rhs.m_pszPosition; }
// increment to next substring
iterator & operator ++ ()
{
const charT * pszNext = SkipDelimeters(m_pszEnd, m_pszDelimeters);
if (pszNext)
{
m_pszPosition = pszNext;
m_pszEnd = FindOneOfOrNil(m_pszPosition, m_pszDelimeters);
}
else
{
m_pszPosition += GetLength(m_pszPosition);
}
return *this;
}
// postfix increment
const iterator operator ++ (int)
{
// note: the const return type flags misuse patterns (see More Effective C++, Item 6)
iterator old(*this);
++(*this);
return old;
}
// dereference == CString
CString operator * () const { return CString(m_pszPosition, static_cast<int>(m_pszEnd - m_pszPosition)); }
// iterators on our characters
const charT * begin() const { return m_pszPosition; }
const charT * end() const { return m_pszEnd; }
private:
const charT * m_pszPosition;
const charT * m_pszDelimeters;
const charT * m_pszEnd;
};
typedef iterator const_iterator;
public:
substring_container_adapter(const charT * pszString, const charT * pszDelimeters)
: m_pszString(pszString)
, m_pszDelimiters(pszDelimeters)
, m_end(pszString + GetLength(pszString), m_pszDelimiters)
{ }
// iterators
iterator begin() const { return iterator(m_pszString, m_pszDelimiters); };
iterator end() const { return m_end; };
private:
const charT * m_pszString; // zero-terminated character array
const charT * m_pszDelimiters; // delimiters
const iterator m_end; // end delimiter
};
}
typedef details::substring_container_adapter<TCHAR> substring_container_adapter;
答案 3 :(得分:0)
您收到错误的原因是:
printf("%s",lineOfText[0]);
是char使用不同的标志。你需要:
printf("%c",lineOfText[0]);
那只会打印c-string中的字符。只需遍历数组即可访问剩余的字符。
答案 4 :(得分:0)
这是一个简单的提示,
继续执行上述步骤,直到字符串结束。