我正在编写一个程序,允许用户输入1到9之间的数字。然后根据用户输入的数字显示输出的宽度。例如。如果输入1,程序应打印出“您的输入为1”。如果输入5,程序应打印出“您的输入为XXXXX5”[X =空格]
所以我做了什么初始化输入的整数大小的char数组,负责宽度。然后用''相应地使用for循环初始化char数组。
编号1到8时一切正常。但是当我输入9时,数字前会有随机字符,例如“你的输入是 @ 9”。
发生了什么事?似乎编译器没有为9的情况添加字符串终止符。然后,当我手动将最后一个字符设置为'\ 0'时,它工作正常。
以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char * argv[]){
int num;
do{
//prompt user to enter an int
printf("Please enter an integer between 1 and 9 inclusive: ");
scanf(" %d", &num);
//check if the number is between 1 and 9
if (num < 1 || num > 9) puts("You have enter an invalid integer! Try again!");
//ask for input unless valid
}while(num < 1 || num > 9);
char space[num]; //max width is num-1 but 1 more slot for string terminator
//initiate the string according to the width
for (int i = 0 ; i < num - 1 ; i++){
space[i] = ' ';
}
//space[num - 1] = '\0';
//display int according to the width
printf("Your input is %s%d\n", space, num);
return 0;
}
答案 0 :(得分:2)
width字段可用于指定要在其中打印值的字段。以下%是宽度和精度字段。 %5d
始终使用宽度5.使用%*d
星号允许使用可变宽度参数,在此示例中为num + 1
。宽度需要整数类型。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char * argv[]){
int num = 0;
do{
//prompt user to enter an int
printf("Please enter an integer between 1 and 9 inclusive: ");
if ( 1 != scanf(" %d", &num)) {
num = 0;
//input was not an int so check for EOF
if ( EOF == getchar ( )) {
return 0;
}
//clean pending characters up to newline
while ( '\n' != getchar ( )) { }
}
//check if the number is between 1 and 9
if (num < 1 || num > 9) puts("You have enter an invalid integer! Try again!");
//ask for input unless valid
}while(num < 1 || num > 9);
//display int according to the width
printf("Your input is:%*d\n", num + 1, num);
return 0;
}
答案 1 :(得分:1)
当你在堆栈中声明你的char数组时,它的值不会初始化为0,这意味着那些插槽包含目前堆栈中的任何内容。
另外说,令人惊讶的部分不是9处的行为,而是每隔一个值,因为这个char数组在覆盖它们之前的内容纯粹是未定义的。
如果你想要某个结果,你必须自己初始化它。
答案 2 :(得分:1)
使用%s
格式说明符打印字符串会查找NULL终止符'\0'
并继续打印字符,直到找到NULL terminator
。
由于space[]
数组是本地的,因此它可以具有任何垃圾值。最后一个元素可能不是'\0'
,因此您在输出中看到了奇怪的字符。
因为工作的情况不是可预测的行为。
因此,您需要明确地使用'\0'
终止字符串,或者您可以在使用数组之前在开头执行memset。
memset(space, 0, sizeof(space));