我尝试使用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;
}
答案 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;
}
输入和输出 :
编辑 回答有关结果中不需要的字符的评论问题 (和原始问题: ......但如果我输入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;
}