【问题标题】:Having problem with allocating memory and pointers [closed]分配内存和指针有问题[关闭]
【发布时间】:2020-12-16 15:06:52
【问题描述】:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char slovo(char *x);
int main ()
{
    char x;
    x=(char *)malloc(50*sizeof(char));
    fgets(x,sizeof(x),stdin);
    printf("%s",slovo(x));
    return 0;
    
}

char slovo(char *x)
{
    int i,n;
    n=strlen(x);
    for(i=0;i<n;i++)
    {
        if ((x[i]>='A' && x[i]<='Z') || (x[i]>='a' && x[i]<='z')) x[i]=x[i];
        else x[i]= ('A'+(rand()%26) || ('a'+(rand()%26)));
    }
    return x;
    
}

任务是输入一个最多 50 个字符的字符串,并为 50 个字符分配内存。如果字符串中的字符不是字母,我必须将其随机转换为任何字母。我有很多错误,我不知道该怎么办。

8 3 C:\Users\x\Documents\juarsr.c [警告] 赋值从指针中生成整数而不进行强制转换

9 8 C:\Users\x\Documents\juarsr.c [警告] 传递 'fgets' 的参数 1 使指针从整数而不进行强制转换

10 20 C:\Users\x\Documents\juarsr.c [警告] 传递 'slovo' 的参数 1 使指针从整数而不进行强制转换

4 6 C:\Users\x\Documents\juarsr.c [注意] 预期为 'char ' 但参数是 'char' 类型

24 2 C:\Users\x\Documents\juarsr.c [警告] return 从指针中生成整数而不进行强制转换

【问题讨论】:

  • 另外,这并没有引发警告,但在 slovo 的第 7 行中,您实际上将 x[i] 设置为这两个值的逻辑 or,这实际上将始终为1,因为它们都将非零。相反,您想做类似else x[i]=(rand() % 2) ? ('A'+(rand()%26)):('a'+(rand()%26)); 的事情。
  • 你好像不明白charchar*以及它们之间的区别。我建议你回去重读你的讲座,从一本好书开始The Definitive C Book Guide and List
  • (如果你还没有遇到C中的三元运算符(即__ ? __ : __运算符),那这行代码基本上返回冒号右边的值,如果表达式问号左边为0,否则返回冒号左边的值)
  • @jurepure123 这个赋值x[i]=x[i]有什么意义?

标签: c pointers c-strings allocation function-definition


【解决方案1】:

在这段代码中sn-p

char x;
x=(char *)malloc(50*sizeof(char));

您声明了x 类型为char 的标识符,但您尝试将其分配给char * 类型的对象。

你需要声明一个指针

char *x;

在本次通话中

fgets(x,sizeof(x),stdin);

您再次使用char 类型的对象x。但是,如果您根据需要重新声明标识符,即具有 char * 类型,但此调用将不正确,因为 sizeof( x ) 产生的指针大小不等于 50

你必须写

fgets(x, 50 ,stdin);

您还需要删除可以通过函数fgets 附加到输入字符串的换行符'\n'

函数slovo应该声明为

char * slovo( char *x );

因为在函数中您返回的是指针x

在这个 if 语句中将 x[i] 赋值给 x[i]

if ((x[i]>='A' && x[i]<='Z') || (x[i]>='a' && x[i]<='z')) x[i]=x[i];

没有意义。

在 else 子语句中

else x[i]= ('A'+(rand()%26) || ('a'+(rand()%26)));

对象x[i] 将始终具有值1,因为它是赋值右侧使用的逻辑或表达式的值。

程序可以如下所示。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char * slovo( char *s )
{
    const char *letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const size_t total = 26;
    enum { LowerCase = 0, UpperCase = 1 };
    
    for ( char *p = s; *p; ++p )
    {
        if ( strchr( letter, toupper( ( unsigned char )*p ) ) == NULL )
        {
            char c = letter[ rand() % total] ;
            if ( rand() % 2 == LowerCase ) c = tolower( c );
            *p = c;
        }
    }
    
    return s;
}

int main(void) 
{
    const size_t N = 50;
    char *s = malloc( N );
    
    fgets( s, N, stdin );
    
    s[strcspn( s, "\n" )] = '\0';
    
    puts( slovo( s ) );

    free( s );
    
    return 0;
}

如果输入字符串"Hello World!",那么它的输出可能是这样的

HellonWorldL

【讨论】:

  • 28 25 C:\Users\x\Documents\asfa.cpp [错误] 从 'void*' 到 'char*' 的无效转换 [-fpermissive]
  • @jurepure123 这意味着您正在将程序编译为 C++ 程序而不是 C 程序。在 C++ 中,您必须从 nalloc 转换返回指针。那就是你需要写 char *s = ( char * ) malloc( N );
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多