我必须用倒数第二个字母改变第二个字母,并且超过3个字母。
示例我有这个字符串:亚历克斯仅仅是
结果应该是:Aelx是mree
但是当我运行我的程序时,我得到了这个:Axel` aler
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i,n,j=0;
char text[81],cuv[44],l;
printf("Introduce-ti textul:");
gets(text);
for(i=0;i<strlen(text);i++)
{
if(text[i] != 32) {
cuv[j]=text[i];
j += 1;
} else {
n = strlen(cuv) - 1;
l= cuv[1];
cuv[1]=cuv[n-1];
cuv[n-1]=l;
printf("%s ",cuv);
strcpy(cuv,"");
j=0;
}
}
return 0;
}
答案 0 :(得分:0)
首先,您不想使用gets
。它已从标准库中删除,因为它不安全,请改用fgets
。话虽这么说,你需要做的就是将你的输入字符串标记为单词,然后如果单词大于3个字符,则交换第二个和最后一个字符。一种方法是:
#include <stdio.h>
#include <string.h>
#define MAXS 256
#define MAXW 64
int main (void) {
size_t len;
char str[MAXS] = {0};
char word[MAXW] = {0};
char *p = NULL;
fgets (str, MAXS, stdin); /* read input from stdin */
/* tokenize string */
for (p = strtok (str, " "); p; p = strtok (NULL, " \n"))
{
strncpy (word, p, MAXW - 1); /* copy token to word */
if ((len = strlen (word)) > 3) /* if word > 3 */
{
char tmp = word[1]; /* swap 2nd & next to last */
word[1] = word[len-2];
word[len-2] = tmp;
}
printf ("%s ", word);
}
putchar ('\n');
return 0;
}
使用/输出强>
$ printf "Alex are mere\n" | ./bin/swap2nd
Aelx are mree
或者如果您想输入文字:
$ ./bin/swap2nd
Alex are mere
Aelx are mree
使用开始/结束指针的第二种方法
您还可以使用开始指针(下面的fgets
)和结束指针来修改原始字符串就绪p
。 (下面的ep
)按字符逐个字符逐行,每次结束指针指向space
,{{ 1}}或tab
然后使用 start 和 end 指针之间的差异来检查单词的长度并执行字符交换(如果长度)大于3个字符。您可以浏览每个版本并进行比较:
newline
使用/输出强>
#include <stdio.h>
#define MAXS 256
int main (void) {
char str[MAXS] = {0};
char *p = NULL;
char *ep = NULL;
fgets (str, MAXS, stdin); /* read input from stdin */
p = ep = str;
while (*ep) /* for each char, if a space, tab or newline */
if (*ep == ' ' || *ep == '\t' || *ep == '\n') {
if ((ep - p) > 3) { /* if length > 3 */
char tmp = *(p + 1); /* swap chars */
*(p + 1) = *(ep - 2);
*(ep - 2) = tmp;
}
p = ++ep; /* set p to next word */
}
else
++ep;
printf ("%s\n", str);
return 0;
}
您在这两种方法之间选择哪种方法,以及Vlad发布的方法,主要是品味/选择。一切都是有效的,只是完成同样事情的不同方式。如果您有疑问,请告诉我。
答案 1 :(得分:0)
尝试以下方法
#include <stdio.h>
int main( void )
{
char s[] = "Alex Chiurtu";
char t[sizeof( s )];
size_t i = 0, j = 0;
do
{
t[i] = s[i];
if ( s[i] != ' ' && s[i] != '\t' && s[i] != '\0' )
{
++j;
}
else if ( j != 0 )
{
if ( j > 3 )
{
char c = t[i-j + 1];
t[i-j+1] = t[i-2];
t[i-2] = c;
}
j = 0;
}
} while ( s[i++] );
puts( s );
puts( t );
return 0;
}
程序输出
Alex Chiurtu
Aelx Ctiurhu
考虑到函数gets
不安全,不再受C标准支持。
使用像32
这样的幻数也是一个坏主意。其含义尚不清楚。
在程序数组中cuv
未初始化为零,因此以下语句
n = strlen(cuv) - 1;
导致程序的未定义行为。每次计算字符串的长度也不是一个好主意。