【问题标题】:Arbitrary character printed while manipulating string操作字符串时打印任意字符
【发布时间】:2021-10-07 01:30:01
【问题描述】:

我创建了用户定义的函数 STR_LEN_BUFFER 来模仿 strcpy 的行为,但它不会复制空字符 '\0',而是继续打印空格以填充结果字符串,其长度由 MAX_LEN 指定(设置在这种情况下为 15)。仅当输入字符串的长度小于 8 时才会填充任意字符(在这种情况下是笑脸?)。

#include <stdio.h>
#include <string.h>
#define MAX_LEN 15
int i;
int max_len;
char Buffer_Space[MAX_LEN]="";
char* STR_LEN_BUFFER(char* og);
void main()
{ 
    int n;
    char ipstring[MAX_LEN];
    printf("Enter your string\n");
    scanf("%s",ipstring);   
    printf("\n");
    printf("your string modified\n");
    printf("%s",STR_LEN_BUFFER(ipstring));
    printf("<- this would be the starting position of the next string");
}

char* STR_LEN_BUFFER(char* og){
    
    for(i=0;i<MAX_LEN;i++){
        if(og[i]!='\0')
        Buffer_Space[i]+=og[i];
        else
        Buffer_Space[i]+=' ';
    }
    return Buffer_Space;
}

输出: 输入你的字符串 嘿

您的字符串已修改 嘿☺

【问题讨论】:

  • 您的问题是什么?你为什么用+=

标签: arrays c loops for-loop c-strings


【解决方案1】:

对于初学者,因为传递的字符串在函数STR_LEN_BUFFER 中没有改变,那么它的参数应该有限定符const

char* STR_LEN_BUFFER(const char* og);

如果你在printf的这个调用中使用格式字符串%s

printf("%s",STR_LEN_BUFFER(ipstring));

那么表达式STR_LEN_BUFFER(ipstring) 必须产生一个字符串。否则你应该使用格式字符串"%.*s" like

printf("%.*s", MAX_LEN, STR_LEN_BUFFER(ipstring));

当您使用复合赋值运算符 += 而不是赋值运算符 =

Buffer_Space[i]+=og[i];

Buffer_Space[i]+=' ';

那么你会在函数的第二次和后续调用中得到意想不到的结果。您应该使用赋值运算符 = 而不是复合赋值运算符 +=.

全局变量max_len声明如下

int max_len;

未在您的程序中使用。此外,将函数中使用的变量i 声明为全局变量也是没有意义的。

由于具有自动存储持续时间的变量ipstring没有显式初始化

char ipstring[MAX_LEN];

它包含具有不确定值的元素。所以在函数STR_LEN_BUFFER中使用这个if语句

if(og[i]!='\0')

导致未定义的行为。该函数可以通过以下方式定义

char * STR_LEN_BUFFER( const char *og )
{
    size_t i = 0;

    for ( ; i + 1 < MAX_LEN &&  og[i] != '\0'; i++ )
    {
        Buffer_Space[i] = og[i];
    }

    for ( ; i + 1 < MAX_LEN; i++ )
    {
        Buffer_Space[i] = ' ';
    }

    return Buffer_Space;
}

这是一个演示程序。

#include <stdio.h>

#define MAX_LEN 15

char Buffer_Space[MAX_LEN]="";

char * STR_LEN_BUFFER( const char *og )
{
    size_t i = 0;

    for ( ; i + 1 < MAX_LEN &&  og[i] != '\0'; i++ )
    {
        Buffer_Space[i] = og[i];
    }

    for ( ; i + 1 < MAX_LEN; i++ )
    {
        Buffer_Space[i] = ' ';
    }

    return Buffer_Space;
}

int main(void) 
{
    char ipstring[MAX_LEN];
    
    printf("Enter your string\n");
    scanf("%s",ipstring);
    
    printf("\n");
    printf("your string modified\n");
    printf("\"%s\"\n",STR_LEN_BUFFER(ipstring));
}

如果要输入字符串

Hello

那么程序输出将是

your string modified
"Hello         "

【讨论】:

  • 我个人从未使用过size_t(见过它被使用过,但从未使用过)。 1) 与使用int 相比,它有什么优势吗? 2) while ( i + 1 &lt; MAX_LEN &amp;&amp; og[i] != '\0' ) 优于 if(og[i]!='\0') 的原因是因为我们同时检查索引和字符串?它是如何工作的?
  • 我已经按照您所说的进行了更改(用户定义的函数和主函数),但程序仍然无法运行。 “您的字符串已修改”后,控制台上不会打印任何内容
  • @Aloy 很抱歉出现错误。查看我更新的帖子。
  • 现在可以使用了。谢谢。你能帮我解决我在第一个问题中发布的问题吗?
  • @Aloy size_t 是一个无符号整数类型,通常对应于由运算符 sizeof 返回的类型 unsigned long 类型。
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2017-09-18
  • 2014-01-02
相关资源
最近更新 更多