在遍历数组C时获得奇怪的输出

在遍历数组C时获得奇怪的输出,c,arrays,loops,C,Arrays,Loops,我有一个char指针数组,例如char*arrayHolder[20]。当我尝试在数组中循环时,如果用户在第二个输入上输入项目,我会得到意外的输出 例如: input> 1 2 3 1 2 3 input>2 3 4 3 3 3 1 导致错误的循环: for(i = 0; arrayHolder[i] != NULL; ++i) { printf("%c\n", arrayHolder[i]); 令牌输入代码: char* token; char buffe

我有一个
char
指针数组,例如
char*arrayHolder[20]
。当我尝试在数组中循环时,如果用户在第二个输入上输入项目,我会得到意外的输出

例如:

input> 1 2 3 
1
2
3
input>2 3 4 
3
3 
3

1
导致错误的循环:

for(i = 0; arrayHolder[i] != NULL; ++i) { 
    printf("%c\n", arrayHolder[i]); 
令牌输入代码:

char* token; 
char buffer [100];
char input[25000];
int i;
char *tokenHolder[300];
int pos = 0; 

while(1) {
    printf("repl> ");
    fgets(buffer, sizeof(buffer), stdin);
    token = strtok(buffer, " ");

    while(token != NULL) {
        tokenHolder[pos] = token;
        token = strtok(NULL, " ");
        pos++;
    }

在第二次
循环前初始化
pos=0

pos = 0; //<-- This.
while(token != NULL)
{    
   tokenHolder[pos] = token;
   token = strtok(NULL, " ");
   pos++;
}

你能把你填充数组的代码贴在哪里吗?@pranitkothari编辑过。无限while循环在for循环的范围内。仅供参考。编辑,现在,我在尝试输出tokenHolder[I]时遇到Seg错误,而在尝试tokenHolder[I][I]时,我得到了初始描述中描述的行为。我测试了printf(“%s\n”,tokenHolder[2]),看看我的值输入是否正确,它们是否正确。@user2757849您需要tokenHolder作为char*tokenHolder[300];或字符令牌持有者[300];?一个是包含每个元素300个字符的指针数组,另一个只是一个包含300个字符的数组?@user2757849。。现在检查。可以解释行的功能是如何工作的吗?我使用了一个指针数组,因为如果我没有,编译器会给我这个警告,警告:赋值从指针生成整数,而不使用强制转换[enabled by default]token=strtok(buffer,”);我使用char-token和char-tokenHolder[200]进行了测试,然后我打印了第一个初始位置,但没有得到任何输出和大量警告。
int main()
{
  char* token; 
  char buffer [100];
  int i;
  char *tokenHolder[300];
  int pos = 0; 
  int row = 0;

  while(1)
  {       
      printf("repl> ");
      fgets(buffer, sizeof(buffer), stdin);
      token = strtok(buffer, " ");

      pos = 0;
      while(token != NULL){

          (tokenHolder + row)[pos] = token;
          token = strtok(NULL, " ");
          pos++;
      }
      (tokenHolder + row)[pos] = '\0';

      for(i =0; (tokenHolder + row)[i] != NULL; ++i){ 
          printf("%s\n", (tokenHolder + row)[i]); 
      }
      row++;
      if(row > 2) // Breaking of row exceeds 10. You can enter your suitable condition.
          break;
  }


  return 0;
}