Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 意外的';%';出现在控制台中_C_Console_Printf - Fatal编程技术网

C 意外的';%';出现在控制台中

C 意外的';%';出现在控制台中,c,console,printf,C,Console,Printf,我正在阅读K&RCProgramming一书,我刚刚完成练习1-13,在练习中,你可以打印出输入单词长度的直方图。我的水平柱状图很好,但我的垂直柱状图的末尾有一个“%”符号,我不明白为什么会这样。以下是我认为导致问题的循环: for (i = 0; i < array_length; i++) { printf("%-4d", i + 1); } 如果我去掉这个循环,垂直条可以很好地打印出来,我只是没有得到它们下面的编号 这是怎么回事?据我猜测,printf在'I'中额外运行了一

我正在阅读K&RCProgramming一书,我刚刚完成练习1-13,在练习中,你可以打印出输入单词长度的直方图。我的水平柱状图很好,但我的垂直柱状图的末尾有一个“%”符号,我不明白为什么会这样。以下是我认为导致问题的循环:

for (i = 0; i < array_length; i++) {
    printf("%-4d", i + 1);
}
如果我去掉这个循环,垂直条可以很好地打印出来,我只是没有得到它们下面的编号

这是怎么回事?据我猜测,printf在'I'中额外运行了一次垃圾数据,但我不知道这是为什么或如何发生的

我在Ubuntu上用gcc编译,如果这有什么不同的话

以下是完整的代码供您参考:

#include <stdio.h>

#define IN  1
#define OUT 0
#define ARRAY_SIZE 1000

int main() {

  int c, current_word_length, state, i, j, current_word, largest, array_length, top;
  int word_lengths[ARRAY_SIZE];

  current_word_length = current_word = largest = 0;
  state = OUT;

  for (i = 0; i < ARRAY_SIZE; i++) {
    word_lengths[i] = 0;
  }

  printf("Enter up to 1000 words and this program will calculate their length.\n");
  printf("Please enter a newline, tab, or space before the last word entered, then EOF to print summary.\n\n");

  while ((c = getchar()) != EOF) {

    if (c == ' ' || c == '\t' || c == '\n') {
      if (state == IN) {
        word_lengths[current_word++] = current_word_length;
        if (current_word_length > largest) {
          largest = current_word_length;
        }
        current_word_length = 0;
        state = OUT;
      }
    } else {
      state = IN;
      current_word_length++;
    }

  }

  array_length = current_word;

  printf("\nWord Lengths Histogram Horizontal:\n\n");

  for (i = 0; i < array_length; i++) {
    printf("%-4d: ", i + 1);
    for (j = 0; j < word_lengths[i]; j++) {
      printf("=");
    }
    printf("\n");
  }

  printf("\nWord Lengths Histogram Vertical:\n\n");

  top = largest;

  while (top > 0) {

    for (i = 0; i < array_length; i++) {
      if (word_lengths[i] >= top) {
        printf("%-4c", '|');
      } else {
        printf("%-4c", ' ');
      }
    }

    printf("\n");

    top--;
  }

  for (i = 0; i < array_length; i++) {
    printf("%-4d", i + 1);
  }

  return 0;
}

好的,正如nos和chqrlie在注释中指出的,我需要在程序的末尾添加一个换行符,以便在程序运行完毕后,shell提示符将出现在换行符上

在main()末尾添加putchar()调用修复了我的问题:

  for (i = 0; i < array_length; i++) {
    printf("%-4d", i + 1);
  }

  putchar('\n');

  return 0;
} // end main()
for(i=0;i
好的,正如nos和chqrlie在注释中指出的那样,我需要在程序末尾添加一个换行符,以便在程序完成运行后,shell提示符将出现在换行符上

在main()末尾添加putchar()调用修复了我的问题:

  for (i = 0; i < array_length; i++) {
    printf("%-4d", i + 1);
  }

  putchar('\n');

  return 0;
} // end main()
for(i=0;i
您确定%不仅仅是您的shell提示符吗?添加一个
printf(“\n”)或<代码>看跌期权(“”)在循环之后(就在
返回0;
之前)好的,这就解决了它!所以,我仍然在学习很多关于shell如何工作的知识,你能给我解释一下发生了什么,或者给我指一个这样的资源吗?好的,你打印出了数字1到7,然后你的程序结束了。所以外壳从你停止打印的地方开始。通过在程序结束前打印一个换行符,shell在一个新的换行符开始它正在做的任何事情,而不是在最后一个数字7之后。我运行了您的程序,并输入了一个字符串,每个字符串的长度为1到9,但不按顺序。它没有打印rogue
%
,但直方图是虚幻的。长度1的3,长度2的5,依此类推。调试器出来的时间到了。@WeatherVane数字不是长度,而是输入的字号。下一步,我将尝试根据单词长度制作一个版本,我可能误解了作业!您确定%不仅仅是您的shell提示符吗?添加一个
printf(“\n”)或<代码>看跌期权(“”)在循环之后(就在
返回0;
之前)好的,这就解决了它!所以,我仍然在学习很多关于shell如何工作的知识,你能给我解释一下发生了什么,或者给我指一个这样的资源吗?好的,你打印出了数字1到7,然后你的程序结束了。所以外壳从你停止打印的地方开始。通过在程序结束前打印一个换行符,shell在一个新的换行符开始它正在做的任何事情,而不是在最后一个数字7之后。我运行了您的程序,并输入了一个字符串,每个字符串的长度为1到9,但不按顺序。它没有打印rogue
%
,但直方图是虚幻的。长度1的3,长度2的5,依此类推。调试器出来的时间到了。@WeatherVane数字不是长度,而是输入的字号。下一步,我将尝试根据单词长度制作一个版本,我可能误解了作业!您还可以使用
putchar('\n')
以输出换行符。它的开销小于
printf(“\n”)
@JonathanLeffler:我同意这个原则,但是现代编译器为
printf(“\n”)生成相同的代码
放置(“”)
fputchar('\n')这本身不是shell问题,程序最好用换行符完成输出,因为unix shell通常不会在提示符前打印换行符。在您的例子中,shell提示符是
%
,它出现在程序输出之后。添加
putchar()
会使shell提示出现在下一行的开头。您也可以使用
putchar('\n')
以输出换行符。它的开销小于
printf(“\n”)
@JonathanLeffler:我同意这个原则,但是现代编译器为
printf(“\n”)生成相同的代码
放置(“”)
fputchar('\n')这本身不是shell问题,程序最好用换行符完成输出,因为unix shell通常不会在提示符前打印换行符。在您的例子中,shell提示符是
%
,它出现在程序输出之后。添加
putchar()
会使shell提示符出现在下一行的开头。
  for (i = 0; i < array_length; i++) {
    printf("%-4d", i + 1);
  }

  putchar('\n');

  return 0;
} // end main()