我正在编写位填充的代码,但我没有得到适当的答案,当我检查输入字符串的值时,在字符串的末尾添加了另一个垃圾值。
#include<stdio.h>
#include<string.h>
void input(char[],int);
void stuff(char ch[],int n)
{
char str1[6]="11111";
char str2[6]="00000";
printf("str1=%s\n",str1);
printf("ch=%s\n",ch);
if(!strcmp(ch,str1))
{
printf("\n111101");
}
else if(!strcmp(ch,str2))
{
printf("\n000010");
}
else
{
puts(ch);
}
}
void main()
{
int flag=0;
char ch[5];
input(ch,5);
printf("ch0=%s\n",ch); //printing the input string
for(int i=0;i<5;i++)
{
if((ch[i]!='0')&&(ch[i]!='1'))
{
flag=1;
}
}
if(flag==0)
{
puts("Entered data:");
for(int i=0;i<5;i++)
{
printf("%c",ch[i]);
}
puts("\nAfter stuffing");
printf("ch1=%s\n",ch); //getting garbage value here
stuff(ch,5);
}
else
{
printf("Enter a valid data\n");
printf("%d",flag);
}
}
void input(char ch[],int n)
{
printf("Enter 5 digits\n");
for(int i=0;i<=n;i++)
{
scanf("%c",&ch[i]);
}
}
代码的输出如下所示。
Enter 5 digits
11111
ch0=11111
Entered data:
11111
After stuffing
ch1=11111♣
str1=11111
ch=11111♣
11111♣
Process returned 0 (0x0) execution time : 4.046 s
Press any key to continue.
我正在使用代码块IDE与MINGW。上面的代码应该比较输入的字符串与给定的序列和填充位,如果所有五位是同质的。
2条答案
按热度按时间toe950271#
您的代码具有未定义的行为。例如,您在
main
中声明了一个包含5
元素的字符数组然后调用函数
input
在该函数中,您将在for循环中输入
6
字符也就是说,您正在覆盖数组外部的内存。
考虑到程序输出
scanf
的调用还将换行符
'\n'
存储在内存中数组的最后一个元素之后。您至少应该写入代替
注意格式字符串中的前导空格。它允许跳过白色字符。
数组不包含字符串,但您试图将其作为包含字符串的数组输出
或者在
strcmp
的调用中使用它这又会引起未定义的行为。
要输出数组,可以使用以下格式字符串
要比较字符数组,可以使用
strncmp
或memcmp
。注意,根据C标准,不带参数的函数main应声明为
lndjwyie2#
缺少空字节:
C
中的字符串是以空值终止的字节数组。不能在input
函数中终止ch
。strcmp
确实比较两个字符串,但是它要求它们以空结尾。printf
也需要一个以null结尾的字符串和%s
说明符,否则它不知道何时停止打印,并且您的代码很可能会导致分段错误。访问内存超出界限:
此行:
调用未定义的行为,因为它正在写入超出界限的内存。
ch
已声明为仅包含5个字节,其中必须包含"\0"字符。