我有一个输入字符串,例如:"Hello 12345 WoRlD"
我想把它输出为:"hELLO 54321 wOrLd"
1( 在这里,小写应该转换为大写,反之亦然
2( 反转两个字符串之间的整数
执行后,它将只打印第一个字符串,其余输出将消失
以下是我迄今为止尝试的
#include<stdio.h>
#include<string.h>
char* casechange(char *);
main()
{
char s[30],*p,*q;
int i,j;
printf("Enter string data:");
scanf("%s",s);
q=casechange(s);
printf("Manipulated string data:%sn",s);
}
char* casechange(char *s)
{
int i,j=strlen(s)-1,num;
for(i=0;s[i];i++)
{
if(s[i]>='a'&&s[i]<='z')
{
s[i]-=32;
}
else if(s[i]>='A'&&s[i]<='Z')
{
s[i]+=32;
}
}
if(s[i]>='0'&&s[i]<='9'&&s[j]>='0'&&s[j]<='9')
//for(i=0;i<j;i++,j--)
//{
{
num=s[i];
s[i]=s[j];
s[j]=num;
}
//}
return s;
}
如何才能做到这一点?
"执行后只打印第一个字符串,其余输出消失"的问题是:
scanf("%s",s);
scanf(("%s"格式字符串告诉scanf读取字符串,但只能读取到第一个空格。因此,如果您输入:
"Hello 12345 WoRlD"
scanf("%s",s(将只将"Hello"复制到"s"中。
要解决此问题,请更改:
scanf("%s",s);
对此:
fgets(s, sizeof(s), stdin);
但是,fgets((可能会在字符串末尾留下不需要的'\n'。不需要的"\n"可以通过在fgets((之后插入以下代码来消除:
q=strchr(s,'n');
if(q)
*q = ' ';
然后输出为:
"hELLO 12345 wOrLd"
扰流板警报!
请参阅我的版本"casechange((",它也会反转数字。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char* casechange(char *);
int main(){
char s[30];
printf("Enter string data:");
scanf("%29[^n]",s);//%s : separated by white space
casechange(s);
printf("Manipulated string data:%sn", s);
return 0;
}
char* casechange(char *s){
int i;
for(i=0;s[i];i++){
if(islower(s[i]))
s[i] = toupper(s[i]);
else if(isupper(s[i]))
s[i] = tolower(s[i]);
else if(isdigit(s[i])){
int j, n;
char num[30];
sscanf(&s[i], "%29[0123456789]%n", num, &n);
for(j=0;j<n;++j)
s[i+j] = num[n-j-1];
i+=n-1;
}
}
return s;
}
else if(isdigit(s[i])){
int j, n;
char num;
sscanf(&s[i], "%*[0123456789]%n", &n);
for(j=0;j<n/2;++j){
num = s[i+j];
s[i+j] = s[i+n-j-1];
s[i+n-j-1] = num;
}
i+=n-1;
}