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