C

时间:2017-10-25 10:59:11

标签: c arrays string

我正在编写一个程序,允许用户输入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;
}

3 个答案:

答案 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));