分配内存和指针时遇到问题

问题描述

#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 [警告]返回会从指针进行整数转换而无需强制转换

解决方法

在此代码段中

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

您声明的标识符x的类型为char,但是您正在尝试为其分配类型为char *的对象。

您需要声明一个指针

char *x;

在此次通话中

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

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

你必须写

fgets(x,50,stdin);

此外,您还需要删除可以由功能'\n'附加到输入字符串的换行符fgets

函数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,因为它是赋值右侧使用的逻辑OR表达式的值。

程序的外观如下。

#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