我有两个char数组:(用于清晰的魔术数字)
char Intermediary[121];
char RI[20][7];
我使用以下代码将Intermediary的内容复制到RI :(请记住,每行需要一个空分隔符(20 *(7 - 1))= 121 - 1)
int a = 0;
int b = 0;
int c = 0;
for( a=0; a<20; a++ )
{
for( b=0; b<6; b++ )
{
RI[a][b] = Intermediary[c++];
}
RI[a][6] = '\0';
}
我打算使用strchr,检查是否例如RI [0] [0]到RI [0] [7]包含y。如果事实证明在该范围内找不到y,程序应该迭代到RI [1] [0]和RI [1] [7]之间的字符。
但是,strchr将指针作为参数,而不是char数组。
如何制作指针,我可以在其中遍历每一行?
另一方面,如果有人想要额外的布朗尼点,我的代码是否可以将1D数组转换为2D数组?
答案 0 :(得分:2)
要在给定行chr
上找到字符a
,您可以使用
char *pch;
pch = strchr( RI[a], chr );
if(pch)
{
// character found; pch is a pointer to it.
}
else
{
// character not found
}
RI[a]
是指向行的第一个元素的指针,也可以表示为&(RI[a][0])
但首先你必须修复你的while循环,因为你没有按照你在问题中所说的做法(为每一行创建一个以NULL结尾的字符串)。
我建议这个修复版本,使用两个for
循环重写:
for( a=0; a<20; a++ )
{
for( b=0; b<6; b++ )
{
RI[a][b] = Intermediary[c++];
}
RI[a][6] = '\0';
}
答案 1 :(得分:0)
需要修复将字符从Intermediary
复制到RI
的代码,以确保RI
包含空终止字符串。
while (c != 121)
{
if (b == 6) /* Go to the next column, the first element */
{
RI[a][b] = '\0'; // Make sure that R[a] is null terminated.
++a;
b = 0;
}
RI[a][b] = Intermediary[c];
++b; /* Iterate to next letter of RebuiltIntermediary */
++c; /* Iterate to next letter of Intermediary */
}
现在,您可以使用RI
来搜索y
:
for ( int i = 0; i < 21; ++i )
{
if ( strchr(RI[i], 'y') != NULL )
{
// 'y' found. Do what you need to do.
}
}
答案 2 :(得分:-1)
这里可以找到一个很好的例子。
http://www.cplusplus.com/reference/cstring/strchr/
为了搜索每一行,你可以使用for循环迭代每一行,并使用上面的例子,将每一行(作为一个字符串)独立输入到strchr函数。以上示例的修改版本,使用较小的矩阵执行此操作:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main ()
{
char str2[3][3] = {{'a','b','c'},{'d','a','f'},{'g','a','i'}};
for (int i=0;i<3;i++)
{
char * pch;
char str[3]={};
for (int j=0;j<3;j++) str[j] = str2[i][j];
char qw = 'a';
printf ("Looking for the %c character in line %d...\n",qw,i);
pch=strchr(str,qw);
while (pch!=NULL)
{
printf ("found at %d\n",pch-str+1);
pch=strchr(pch+1,'s');
}
}
return 0;
}
希望这会有所帮助。最好的问候。