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

ecfdbz9o  于 2023-01-08  发布在  其他
关注(0)|答案(2)|浏览(111)

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

#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。上面的代码应该比较输入的字符串与给定的序列和填充位,如果所有五位是同质的。

toe95027

toe950271#

您的代码具有未定义的行为。例如,您在main中声明了一个包含5元素的字符数组

char ch[5];

然后调用函数input

input(ch,5);

在该函数中,您将在for循环中输入6字符

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

scanf的调用

scanf("%c",&ch[i]);

还将换行符'\n'存储在内存中数组的最后一个元素之后。您至少应该写入

scanf(" %c",&ch[i]);
      ^^^^^

代替

scanf("%c",&ch[i]);

注意格式字符串中的前导空格。它允许跳过白色字符。
数组不包含字符串,但您试图将其作为包含字符串的数组输出

printf("ch0=%s\n",ch); //printing the input string

或者在strcmp的调用中使用它

if(!strcmp(ch,str1))

这又会引起未定义的行为。
要输出数组,可以使用以下格式字符串

printf("ch0=%.*s\n", 5, ch); //printing the input string

要比较字符数组,可以使用strncmpmemcmp
注意,根据C标准,不带参数的函数main应声明为

int main( void )
lndjwyie

lndjwyie2#

缺少空字节:

C中的字符串是以空值终止的字节数组。不能在input函数中终止ch
strcmp确实比较两个字符串,但是它要求它们以空结尾。
printf也需要一个以null结尾的字符串和%s说明符,否则它不知道何时停止打印,并且您的代码很可能会导致分段错误。

访问内存超出界限:

此行:

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

调用未定义的行为,因为它正在写入超出界限的内存。ch已声明为仅包含5个字节,其中必须包含"\0"字符。

相关问题