我如何将多个地址指向 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

  1. 通过添加缺失的 } 修复了语法错误,并确保带有输入数据的变量 frase 未被注释掉。
  2. 引入了一个常量 MAX_FIELDS 来保存字段的最大数量,并在调用 fields() 时使用它来调整结果数组 teste2max_fields 参数的大小。
  3. count 现在 returns 找到了多少字段(可能是 >= max_fields);在 icount 计算分隔符数量 ; 而不是字段之前请注意。
  4. 像你一样遍历 *line 指针没有错,但是由于你需要当前找到的字符串的开始和结束,使用两个索引变量似乎更清楚 ij.
  5. field() 已更改为使用 for() 而不是 while() 循环,以强调 j 是我们正在遍历的索引。
  6. 最后,添加了一个计数 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