我正在编写位填充的代码,但我没有得到适当的答案,当我检查输入字符串的值时,在字符串的末尾添加了另一个垃圾值。
#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=%sn",str1);
printf("ch=%sn",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=%sn",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=%sn",ch); //getting garbage value here
stuff(ch,5);
}
else
{
printf("Enter a valid datan");
printf("%d",flag);
}
}
void input(char ch[],int n)
{
printf("Enter 5 digitsn");
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。上面的代码应该将输入的字符串与给定序列进行比较,如果所有五位都是同质的,则填充位。
您的代码有未定义的行为。例如,在main
5
元素的字符数组。char ch[5];
那么你正在调用函数input
input(ch,5);
在函数中,您将在for循环
中输入6
字符void input(char ch[],int n)
{
printf("Enter 5 digitsn");
for(int i=0;i<=n;i++)
{
scanf("%c",&ch[i]);
}
}
这意味着你正在覆盖数组外的内存。
考虑程序输出
Enter 5 digits
11111
ch0=11111
scanf
的调用
scanf("%c",&ch[i]);
还将新的行字符'n'
存储在数组最后一个元素之后的内存中。你至少应该写
scanf(" %c",&ch[i]);
^^^^^
不是
scanf("%c",&ch[i]);
注意格式字符串中的前导空格。它允许跳过空白字符。
数组不包含字符串,但您试图将其输出为包含字符串
printf("ch0=%sn",ch); //printing the input string
或者在strcmp
的调用中使用它,例如
if(!strcmp(ch,str1))
再次调用未定义行为。
要输出数组,可以使用以下格式字符串
printf("ch0=%.*sn", 5, ch); //printing the input string
和比较字符数组,您可以使用strncmp
或memcmp
。
请注意,根据C标准,不带参数的函数main应声明为
int main( void )
缺少null-byte:
C
中的字符串是一个以空结束的字节数组。input
函数中不能终止ch
。
strcmp
确实比较两个字符串,但它要求它们以空结束。
printf
也需要一个带有%s
格式说明符的以空结尾的字符串,否则它不知道何时停止打印。你的代码很可能会导致分段错误。
访问内存越界:
这条线:
for(int i=0;i<=n;i++)
调用未定义行为,因为它正在写越界内存。ch
被声明为只包含5个字节,其中必须包含' '字符。