我如何将多个地址指向 c 中的字符串数组?
how do i point multiple addresses to an array of strings in c?
任务是将字符串分成几个字段。每个字段由“;”限定,cada campo é armazenado num array de strings
只有 PTR[0] 是正确的。我认为这是因为对 *ptr[] 的地址分配。我怎样才能做正确的作业?
int fields(char *line, char *ptrs[], int max_fields ){
int i=0;
int count = 0;
char *aux = line;
while(*line != '[=10=]'){
if(*line == ';')
{
if(i<max_fields)
{
*line='[=10=]';
ptrs[i]=aux;
i++;
aux=line++;
continue;
count++;
}
line++;
}
return count; // retorna o numero de campos totais
}
void print(char *teste2[]){
printf("PTR[0] = %s \n", teste2[0]);
printf("PTR[1] = %s \n", teste2[1]);
printf("PTR[2] = %s \n", teste2[2]);
}
int main() {
int nrCamposIden, campEsper=3;
//char frase[]= "teste; oi ; ze ; primeiro campo; ;terceiro campo \t; ; palavras do quinto campo 1234\n ";
char *teste2[100];
nrCamposIden = fields(frase,teste2,campEsper) ;
printf("Numero campos = %d \n", nrCamposIden);
print(teste2);
return 0;
}
预期输出
PTR[0] = teste
PTR[1] = oi
PTR[2] = ze
output i get
PTR[0] = teste
PTR[1] =
PTR[2] =
感谢大家:D
- 通过添加缺失的
}
修复了语法错误,并确保带有输入数据的变量 frase
未被注释掉。
- 引入了一个常量
MAX_FIELDS
来保存字段的最大数量,并在调用 fields()
时使用它来调整结果数组 teste2
和 max_fields
参数的大小。
count
现在 returns 找到了多少字段(可能是 >= max_fields
);在 i
和 count
计算分隔符数量 ;
而不是字段之前请注意。
- 像你一样遍历
*line
指针没有错,但是由于你需要当前找到的字符串的开始和结束,使用两个索引变量似乎更清楚 i
和 j
.
field()
已更改为使用 for()
而不是 while()
循环,以强调 j
是我们正在遍历的索引。
- 最后,添加了一个计数
n
参数来打印而不是 hard-coding 前 3 个。如果您仍然只想要前 3 个参数,请将 MAX_FIELDS
更改为 3
:
#include <stdio.h>
#define MAX_FIELDS 100
unsigned fields(char *line, char *ptrs[], unsigned max_fields ) {
unsigned count = 0;
unsigned i = 0;
for(unsigned j = 0; line[j]; j++) {
if(line[j] == ';') {
if(count < max_fields) {
line[j] = '[=10=]';
ptrs[count] = line + i;
i = j + 1;
}
count++;
}
}
if(*line) ptrs[count++] = line + i;
return count; // retorna o numero de campos totais
}
void print(char *teste2[], unsigned n) {
for(unsigned i = 0; i < n; i++)
printf("PTR[%u] = %s \n", i, teste2[i]);
}
int main() {
int nrCamposIden, campEsper=MAX_FIELDS;
char frase[]= "teste; oi ; ze ; primeiro campo; ;terceiro campo \t; ; palavras do quinto campo 1234\n ";
char *teste2[MAX_FIELDS];
nrCamposIden = fields(frase, teste2, campEsper) ;
printf("Numero campos = %d \n", nrCamposIden);
print(teste2, nrCamposIden < MAX_FIELDS ? nrCamposIden : MAX_FIELDS);
return 0;
}
这是输出:
Numero campos = 8
PTR[0] = teste
PTR[1] = oi
PTR[2] = ze
PTR[3] = primeiro campo
PTR[4] =
PTR[5] = terceiro campo
PTR[6] =
PTR[7] = palavras do quinto campo 1234
任务是将字符串分成几个字段。每个字段由“;”限定,cada campo é armazenado num array de strings 只有 PTR[0] 是正确的。我认为这是因为对 *ptr[] 的地址分配。我怎样才能做正确的作业?
int fields(char *line, char *ptrs[], int max_fields ){
int i=0;
int count = 0;
char *aux = line;
while(*line != '[=10=]'){
if(*line == ';')
{
if(i<max_fields)
{
*line='[=10=]';
ptrs[i]=aux;
i++;
aux=line++;
continue;
count++;
}
line++;
}
return count; // retorna o numero de campos totais
}
void print(char *teste2[]){
printf("PTR[0] = %s \n", teste2[0]);
printf("PTR[1] = %s \n", teste2[1]);
printf("PTR[2] = %s \n", teste2[2]);
}
int main() {
int nrCamposIden, campEsper=3;
//char frase[]= "teste; oi ; ze ; primeiro campo; ;terceiro campo \t; ; palavras do quinto campo 1234\n ";
char *teste2[100];
nrCamposIden = fields(frase,teste2,campEsper) ;
printf("Numero campos = %d \n", nrCamposIden);
print(teste2);
return 0;
}
预期输出
PTR[0] = teste
PTR[1] = oi
PTR[2] = ze
output i get
PTR[0] = teste
PTR[1] =
PTR[2] =
感谢大家:D
- 通过添加缺失的
}
修复了语法错误,并确保带有输入数据的变量frase
未被注释掉。 - 引入了一个常量
MAX_FIELDS
来保存字段的最大数量,并在调用fields()
时使用它来调整结果数组teste2
和max_fields
参数的大小。 count
现在 returns 找到了多少字段(可能是>= max_fields
);在i
和count
计算分隔符数量;
而不是字段之前请注意。- 像你一样遍历
*line
指针没有错,但是由于你需要当前找到的字符串的开始和结束,使用两个索引变量似乎更清楚i
和j
. field()
已更改为使用for()
而不是while()
循环,以强调j
是我们正在遍历的索引。- 最后,添加了一个计数
n
参数来打印而不是 hard-coding 前 3 个。如果您仍然只想要前 3 个参数,请将MAX_FIELDS
更改为3
:
#include <stdio.h>
#define MAX_FIELDS 100
unsigned fields(char *line, char *ptrs[], unsigned max_fields ) {
unsigned count = 0;
unsigned i = 0;
for(unsigned j = 0; line[j]; j++) {
if(line[j] == ';') {
if(count < max_fields) {
line[j] = '[=10=]';
ptrs[count] = line + i;
i = j + 1;
}
count++;
}
}
if(*line) ptrs[count++] = line + i;
return count; // retorna o numero de campos totais
}
void print(char *teste2[], unsigned n) {
for(unsigned i = 0; i < n; i++)
printf("PTR[%u] = %s \n", i, teste2[i]);
}
int main() {
int nrCamposIden, campEsper=MAX_FIELDS;
char frase[]= "teste; oi ; ze ; primeiro campo; ;terceiro campo \t; ; palavras do quinto campo 1234\n ";
char *teste2[MAX_FIELDS];
nrCamposIden = fields(frase, teste2, campEsper) ;
printf("Numero campos = %d \n", nrCamposIden);
print(teste2, nrCamposIden < MAX_FIELDS ? nrCamposIden : MAX_FIELDS);
return 0;
}
这是输出:
Numero campos = 8
PTR[0] = teste
PTR[1] = oi
PTR[2] = ze
PTR[3] = primeiro campo
PTR[4] =
PTR[5] = terceiro campo
PTR[6] =
PTR[7] = palavras do quinto campo 1234