具有4个以上char输入的倒计时算法中的奇怪字符输出

时间:2014-07-17 01:07:26

标签: c arrays string

我尝试使用12340之类的输入字符串并输出4321。奇怪的是,如果我放置一个小于4的序列(例如:1230),则输出正确(321)。但是,如果我输入12340,我最终会获得4321(↨@。是什么导致了这种行为?

(这不是作业,我跟随http://www.ltam.lu/cours-c/prg-c58.htm的练习6.8来学习C)

这是我的整个代码(我会发布一个小/简洁的代码示例,但我似乎无法解决问题)

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main()
{
    char array[100];

    printf("Shoot me consecutive numbers, end with 0\n");
    scanf("%s",&array);
    int count = strlen(array);
    char countdown[count];
    int reverseIndex;
    int index = 0;
    for(reverseIndex = count-1;reverseIndex >= 0;reverseIndex--)
    {
        char possibleNumber = array[reverseIndex];
        if(isdigit(possibleNumber) && possibleNumber != '0')
        {
            countdown[index] = possibleNumber;
            index++;
        }
    }
    printf("countdown : %s\n",countdown);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

一条即时错误 就是这一行:

您需要为此行中的NULL终止符提供足够的空间:

char countdown[count + 1];//added +1  

另一个是

scanf("%s",&array);  

将其更改为:

scanf("%s",array); //%s expects char *, &array is of type char (*)[100], parameter type mismatch 

我对原始代码进行了这些修改 (请参阅内联评论),也使用调用memset()初始化倒计时,并运行: (结果如下所示)

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main()
{
    char array[100];

    printf("Shoot me consecutive numbers, end with 0\n");
    scanf("%s",array);//removed &
    int count = strlen(array);
    char countdown[count+1];//add room for NULL terminator
    int reverseIndex;
    int index = 0;
    memset(countdown, 0, count+1);//added to initialize all elements of char array to NULL
    for(reverseIndex = count-1;reverseIndex >= 0;reverseIndex--)
    {
        char possibleNumber = array[reverseIndex];
        if(isdigit(possibleNumber) && possibleNumber != '0')
        {
            countdown[index] = possibleNumber;
            index++;
        }
    }
    printf("countdown : %s\n",countdown);

    getchar();
    getchar();
    return 0;
}

输入和输出

enter image description here

编辑 回答有关结果中不需要的字符的评论问题 (和原始问题: ......但如果我输入12340,我最终会有4321(↨@ ...

创建char countdown[count+1];时,无法保证内容 也就是说,每个位置都可以填充任何随机的位组 Say数组定义为char数组[5];如果没有初始化,它可能在内存中看起来像这样:

|€|Œ|™|¢|§|  

稍后在您的代码中,您将循环以对每个位置进行分配 使用来自stdin的`scanf()获得的字符填充,这很好,
现在,它循环4次后看起来像这样:

|1|2|3|4|§|  

注意,最后一个位置没有终止NULL(0) 通过使用memset(array, 0, 5);,创建的缓冲区将如下所示:

|0|0|0|0|0|  

生成的填充缓冲区如下:

|1|2|3|4|0|  //properly terminated char buf is required for a C string

答案 1 :(得分:2)

倒计时数组不会以NULL结尾,因此printf不知道在哪里停止。

您需要分配count + 1个字符,然后将最后一个字符设置为NULL。

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main()
{
    char array[100];

    printf("Shoot me consecutive numbers, end with 0\n");
    scanf("%s",&array);
    int count = strlen(array);
    char countdown[count + 1];
    int reverseIndex;
    int index = 0;
    for(reverseIndex = count-1;reverseIndex >= 0;reverseIndex--)
    {
        char possibleNumber = array[reverseIndex];
        if(isdigit(possibleNumber) && possibleNumber != '0')
        {
            countdown[index] = possibleNumber;
            index++;
        }
    }
    countdown[index] = 0;
    printf("countdown : %s\n",countdown);
    return 0;
}