C语言中的字符串在程序执行的中间改变吗?



我正在编写位填充的代码,但我没有得到适当的答案,当我检查输入字符串的值时,在字符串的末尾添加了另一个垃圾值。

#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

和比较字符数组,您可以使用strncmpmemcmp

请注意,根据C标准,不带参数的函数main应声明为

int main( void )

缺少null-byte:

C中的字符串是一个以空结束的字节数组。input函数中不能终止ch

strcmp确实比较两个字符串,但它要求它们以空结束。

printf也需要一个带有%s格式说明符的以空结尾的字符串,否则它不知道何时停止打印。你的代码很可能会导致分段错误。

访问内存越界:

这条线:

for(int i=0;i<=n;i++)

调用未定义行为,因为它正在写越界内存。ch被声明为只包含5个字节,其中必须包含''字符。

相关内容

  • 没有找到相关文章

最新更新