如何在JavaScript中获取字符串数组的字符串?
我在想一个像"Hello world!"数组一样的字符串['H','e','l','l','o',' ','w','o','r','l','d','!']
有没有一种很好的方法来迭代字符串的字符?我希望能够做到foreach,array_map,array_walk,array_filter等一个字符串的字符.
类型转换/杂耍没有让我到处(将整个字符串作为数组的一个元素),我发现的最佳解决方案是使用for循环来构造数组.感觉应该有更好的东西.我的意思是,如果你可以索引它,你应该不能迭代吗?
这是我得到的最好的
function stringToArray($s)
{
$r = array();
for($i=0; $i<strlen($s); $i++)
$r[$i] = $s[$i];
return $r;
}
$s1 = "textasstringwoohoo";
$arr = stringToArray($s1); //$arr now has character array
$ascval = array_map('ord', $arr); //so i can do stuff like this
$foreach ($arr as $curChar) {....}
$evenAsciiOnly = array_filter( function($x) {return ord($x) % 2 === 0;}, $arr);
Run Code Online (Sandbox Code Playgroud)
有没有:
A)使字符串可迭代的一种方法
B)从字符串构建字符数组的更好方法(如果是这样,另一个方向怎么样?)
我觉得我错过了一些明显的东西.
当我设计类接口时,我坐在那里思考是否应该使用const char*或const std::string&经常使用它,当它归结为它时,我常常觉得一只手中有6只,另一只手拿着半打.
采用以下两个函数原型:
void foo(const char* str);
void foo(std::string str);
Run Code Online (Sandbox Code Playgroud)
如果foo函数是存储字符串,我会说第二个是更好的选择,因为能够传递字符串并尽可能利用移动语义.但是,如果foo只需要读取字符串,const char*解决方案会更好吗?
从性能角度来看,std::string不需要创建临时的.但是,使用已经存在的字符串作为参数调用该函数看起来很突出:foo(mystr.c_str()).更糟糕的是,如果需要在未来的某个时刻对阵列进行更高级的操作,或者如果应该存储副本,则接口必须进行更改.
所以我的问题是:
是否有明确的定义,无论是个人的还是其他的,约定何时std::string或是const char*更好的选择?此外,在开始一个新项目时,最好是与使用保持一致,还是只考虑最适合当前代码块的哪一个?
我的C现在不仅仅是生锈,所以我没有创造出我认为应该非常基本的东西.
允许我将字符数组称为此帖子的字符串.它会让我和你都清楚.
我所拥有的是一个可以容纳1个或更多字符串的数组.例如{"ab","cd","ef"}.我想创建另一个数组来存储字符串数组的多个版本.所以像{{"ab","cd","ef"},{"gh","ij"},{"kl"}}.
我现在拥有的是:
char *arrayOfStrings[50]; // a single array to hold multiple strings
char **arrayOfArraysOfStrings[10]; // array to hold multiple snapshots of arrayOfStrings
Run Code Online (Sandbox Code Playgroud)
字符串数组随着时间的推移而变化,我使用字符串数组数组来基本保存arrayOfStrings的历史快照.当我需要访问数据的快照数组时,我的问题出现了.这是我必须将内容放入快照数组的代码:
arrayOfArraysOfStrings[input_index] = arrayOfStrings; // you can assume input_index is updated correctly, I've already checked that.
Run Code Online (Sandbox Code Playgroud)
这似乎是不正确的,因为当我尝试访问并打印出快照数组的内容时,它只打印出来自最新的arrayOfStrings的信息.我想要的想法是将arrayOfChars所指向的地址存储在快照数组的一个条目中,以便我以后可以访问它.
现在,访问快照数组中的条目是这样完成的:
arrayOfArraysOfChars[historicalIndex][indexOfTargetChar]
Run Code Online (Sandbox Code Playgroud)
我想回答几个问题:
--edit 4/18--部分问题在于我在arrayOfArraysOfStrings中设置指针指向arrayOfStrings指向的相同内容.这是糟糕的,因为arrayOfStrings被编辑.我需要一些方法来复制2D数组...最好是通过简单地为arrayOfStrings分配一个新的内存块来指向.
我有一段代码,我试图在括号内抓取一个表达式,然后使用它.在下面的代码开始的时候,我正在迭代字符数组,并且pcc是指向当前字符的指针,该字符已被确定为a '('.我的目标是将paranthetical表达式放在一个字符数组中pe.
int nnrp = 1; /* Net number of right parantheses */
char * pbpe = pcc; /* Pointer to the beginning paranthetical expression */
for (++pcc; *pcc!= '\0' && nnrp != 0; ++pcc)
{
if (*pcc == '(')
{
++nnrp;
}
else if (*pcc == ')')
{
--nnrp;
}
else if (*pcc == '\0')
{
sprintf(err, "Unbalanced paranthesis");
return -1;
}
}
/* If we're here, *pcc is the closing paranathesis of *pbpe …Run Code Online (Sandbox Code Playgroud) 我正在为学校编写一个程序,要求从文件中读取文本,将所有内容都大写,并删除标点符号和空格.文件"Congress.txt"包含
(国会不得制定任何法律,尊重宗教信仰,禁止自由行使;或者剥夺言论自由或新闻自由;或者人民和平集会的权利,并向政府请求补救不满.)
它读入正确,但我到目前为止删除标点,空格和大写导致垃圾字符的一些主要问题.到目前为止我的代码是:
void processFile(char line[]) {
FILE *fp;
int i = 0;
char c;
if (!(fp = fopen("congress.txt", "r"))) {
printf("File could not be opened for input.\n");
exit(1);
}
line[i] = '\0';
fseek(fp, 0, SEEK_END);
fseek(fp, 0, SEEK_SET);
for (i = 0; i < MAX; ++i) {
fscanf(fp, "%c", &line[i]);
if (line[i] == ' ')
i++;
else if (ispunct((unsigned char)line[i]))
i++;
else if (islower((unsigned char)line[i])) {
line[i] = toupper((unsigned char)line[i]);
i++;
}
printf("%c", line[i]);
fprintf(csis, "%c", line[i]);
}
fclose(fp); …Run Code Online (Sandbox Code Playgroud) 现在让我们看看这个小程序
char s[20]="One";
strcat(s,"Two");
cout<<s<<endl;
Run Code Online (Sandbox Code Playgroud)
这里首先s的值为"One",对于直观表示,这是s的值:
O - n - e - \0
然后我在字符串的末尾添加"Two",产生这个:
O - n - e - T - w - o - \0
现在你可以看到字符串中唯一的空值是在"One"之后,现在是在"OneTwo"之后
我的问题是:null是否被字符串"Two"覆盖,然后它在结尾处添加了它自己的null.
或者在开始时已经存在的空值又回到了最后?
(这个问题似乎没有什么区别,但我想知道我学到的一切)
谢谢
我知道我们必须使用空字符来终止字符串数组,如下所示:
char str[5] = { 'A','N','S','\0' };
Run Code Online (Sandbox Code Playgroud)
但我只是想知道为什么使用空字符来终止这样的数组是必要的?
另外,为什么我们不添加null charater来终止这些: -
char str1[5]="ANS";
Run Code Online (Sandbox Code Playgroud) 我正在研究K&R第二版,第5章.
在页87,引入字符数组的指针如下:
char *pmessage;
pmessage = "Now is the time";
Run Code Online (Sandbox Code Playgroud)
如何知道这pmessage是一个指向字符数组的指针,而不是指向单个字符的指针?
要扩展,请在第94页上定义以下函数:
/* month_name: return the name of the n-th month */
char *month_name(int n)
{
static char *name[] = {
"Illegal month",
"January", "February", "March",
...
};
return (n < 1 || n > 12) ? name[0] : name[n];
}
Run Code Online (Sandbox Code Playgroud)
如果只提供了上面的函数声明,那么如何知道是返回单个字符还是字符数组?
如果假设返回来自month_name()一个字符数组并迭代它直到NULL遇到一个,但返回实际上是一个字符,那么是否有可能出现分段错误?
有人可以演示一个指向单个字符与字符数组的指针的声明和赋值,它们对函数的使用以及已经返回的标识?
我试图写一个函数,将一个数组中删除所有字符,除了'+','-','*','/',和数字.这是我提出的代码:
void eliminateJunk(char string[MAX]){
int i,j;
char stringOut[MAX];
int length = strlen(string) - 1;
for(i=0; i <= length; i++){
if(string[i] != '+'
&& string[i] != '-'
&& string[i] != '*'
&& string[i] != '/'
&& !(isdigit(string[i]))){
for(j=i; j < length; j++){
string[j] = string[j+1];
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,该函数并不总是从c字符串中删除所有垃圾字符 - 它会获得大部分垃圾字符,但偶尔会留下一些.
输入示例:
123 123
Run Code Online (Sandbox Code Playgroud)
数组的示例输出,在修改后:
123123
Run Code Online (Sandbox Code Playgroud)
但是,在某些输入中,它会留下空间......
输入示例:
123 123
Run Code Online (Sandbox Code Playgroud)
示例输出:
123 123
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个问题?我觉得解决方案就在我的鼻子底下,但我似乎无法找到它.