问题描述
#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