printf可以更改其参数吗?

0xF*_*xFF 2 c printf

编辑: 主要的完整代码在这里http://codepad.org/79aLzj2H

再一次,这就是奇怪的行为正在发生

for (i = 0; i<tab_size; i++)
{
  //CORRECT OUTPUT
  printf("%s\n", tableau[i].capitale);
  printf("%s\n", tableau[i].pays);
  printf("%s\n", tableau[i].commentaire);
  //WRONG OUTPUT
  //printf("%s --- %s --- %s |\n", tableau[i].capitale, tableau[i].pays, tableau[i].commentaire);
}
Run Code Online (Sandbox Code Playgroud)

我有一系列以下strcuture

struct T_info
{
    char capitale[255];
    char pays[255];
    char commentaire[255];
};

struct T_info *tableau;
Run Code Online (Sandbox Code Playgroud)

这是阵列的填充方式

int advance(FILE *f)
{
  char c;

  c = getc(f);
  if(c == '\n')
    return 0;

  while(c != EOF && (c == ' ' || c == '\t'))
  {
    c = getc(f);
  }

  return fseek(f, -1, SEEK_CUR);

}

int get_word(FILE *f, char * buffer)
{
  char c;
  int count = 0;
  int space = 0;

  while((c = getc(f)) != EOF)
    {
      if (c == '\n')
      {
    buffer[count] = '\0';
    return -2;
      }

      if ((c == ' ' || c == '\t') && space < 1)
      {
    buffer[count] = c;
    count ++;
    space++;
      }
      else
      {
    if (c != ' ' && c != '\t')
    {
      buffer[count] = c;
      count ++;
      space = 0;
    }       
    else /* more than one space*/
    {
     advance(f);
     break;
    }
      }
    }

   buffer[count] = '\0';
   if(c == EOF)
     return -1;

   return count;
}

void fill_table(FILE *f,struct T_info *tab)
{
    int line = 0, column = 0;

    fseek(f, 0, SEEK_SET);

    char buffer[MAX_LINE];
    char c;
    int res;

    int i = 0;
    while((res = get_word(f, buffer)) != -999)
    {
      switch(column)
      {
        case 0:
        strcpy(tab[line].capitale, buffer); 
        column++;
          break;
        case 1:
          strcpy(tab[line].pays, buffer);
          column++;
          break;
        default:
          strcpy(tab[line].commentaire, buffer);    
          column++;
          break;
      }
      /*if I printf each one alone here, everything works ok*/
          //last word in line
      if (res == -2)
      {
        if (column == 2)
        {
          strcpy(tab[line].commentaire, " ");       
        }
//wrong output here
        printf("%s -- %s -- %s\n", tab[line].capitale, tab[line].pays, tab[line].commentaire);

        column = 0;
          line++;
          continue;
      }
      column = column % 3;

      if (column == 0)
      {
        line++;
      }

      /*EOF reached*/
      if(res == -1)
        return;

    }
    return ;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

尝试这个

    printf("%s -- ", tab[line].capitale);
    printf("%s --", tab[line].pays);
    printf("%s --\n", tab[line].commentaire);
Run Code Online (Sandbox Code Playgroud)

给我结果

 --  --abi  -- Emirats arabes unis
Run Code Online (Sandbox Code Playgroud)

我希望得到

Abu Dhabi -- Emirats arabes unis --
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

sep*_*p2k 5

printf有副作用吗?

好吧,它打印到屏幕上.这是副作用.除此之外:没有.

是printf更改其参数

没有

我得到了错误的结果[...]发生了什么事?

如果错误的结果意味着输出没有出现,那么这可能只是一个行缓冲问题(你的第二个版本不会打印换行符,这可能导致输出无法刷新).

  • +1表示明显的副作用:) (3认同)
  • 不打印到屏幕的主要效果是什么? (2认同)
  • @Juliano:不是.将"副作用"定义为读取除参数以外的任何内容,以及写入或修改除返回值之外的任何内容,这并不罕见.没有副作用的操作则具有有用的属性.见http://en.wikipedia.org/wiki/Side_effect_%28computer_science%29.但我不认为这就是提问者的意思...... (2认同)