我有一个输入字符串,例如:"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:%s\n",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;
}
如何实现这一目标?
答案 0 :(得分:2)
“执行它之后只打印第一个字符串而其余输出消失”的问题是:
scanf("%s",s);
scanf()'%s'格式字符串告诉scanf读取字符串,但只能读取第一个空格。因此,如果您输入:
"Hello 12345 WoRlD"
scanf(“%s”,s)只会将“Hello”复制到's'。
要解决此问题,请更改:
scanf("%s",s);
对此:
fgets(s, sizeof(s), stdin);
但是,fgets()可能会在字符串末尾留下不需要的'\ n'。可以通过在fgets()之后插入以下代码来消除不需要的'\ n':
q=strchr(s,'\n');
if(q)
*q = '\0';
然后输出将是:
"hELLO 12345 wOrLd"
SPOILER ALERT!
查看我的版本'casechange()',它也会反转该号码。
答案 1 :(得分:0)
#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:%s\n", 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;
}