繁体   English   中英

我在 C 有一个关于反转字符串的问题(反转行和字母

[英]I have a problem in C about reversing a string (reversing rows and letters

#include <stdio.h>
#include <string.h>
#define W 5
#define N 10
void print_(const char[W][N],int);
void reverse(char[W][N],int);
int main ( ) {
char words[W][N] ;
char test[N];
char endword[N]="end";
int i=0;

while (scanf("%9s", test), strcmp(test,endword)) {
strcpy(words[i++], test);
printf("%s\n", test);
if(i==W)break;
}
print_((const char(*)[N])words,i);
reverse(words,i);
print_((const char(*)[N])words,i);

return 0;
}
void print_(const char x[W][N],int j){
    int i;
    for(i=0;i<j;i++){
        printf("%d %s\n",i+1,x[i]);
    }
}
void reverse(char x[W][N],int max){
    int i,j,len,p=max;
    char temp[N],temporal[W][N];
    for(i=0;i<max;i++){
        strcpy(temp,x[i]);
        len=strlen(x[i]);
        for(j=0;j<len;j++){
            x[i][j]=temp[len-1-j];
        }
        memcpy(temporal[max-1],x[i],N*sizeof(char));
    }
    print_((const char(*)[N])temporal,max);

}

它设法颠倒了每个单词的字母,但是当我尝试颠倒行时它不起作用我在这里尝试放置内存本身,但这似乎不起作用。 唯一为时间打印的是最后一个 x[max-1],它是为时间 [max-1] 打印的。

在 while 循环的条件下

while (scanf("%9s", test), strcmp(test,endword)) {

使用了带有逗号运算符的表达式,

看来你是我

while ( scanf("%9s", test) == 1 && strcmp(test,endword) != 0 ) {

function 反转原数组的每一行

    strcpy(temp,x[i]);
    len=strlen(x[i]);
    for(j=0;j<len;j++){
        x[i][j]=temp[len-1-j];
    }

但它不会反转数组的行。

这个说法

memcpy(temporal[max-1],x[i],N*sizeof(char));

仅复制数组temporal的第max - 1行中原始数组的当前行。

例如 function 可以写成下面的方式

void reverse( char x[W][N], size_t max )
{
    for ( size_t i = 0; i < max; i++ )
    {
        for ( size_t j = 0, n = strlen( x[i] ); j < n / 2; j++ )
        {
            char c = x[i][j];
            x[i][j] = x[i][n-j-1];
            x[i][n-j-1] = c;
        }
    }

    for ( size_t i = 0; i < max / 2; i++ )
    {  
        char temp[N];
        strcpy( temp, x[i] );
        strcpy( x[i], x[max-i-1] );
        strcpy( x[max-i-1], temp );
    } 
}

这是一个演示程序

#include <string.h>
#include <stdio.h>

#define W 5
#define N 10

void reverse( char x[W][N], size_t max )
{
    for (size_t i = 0; i < max; i++)
    {
        for (size_t j = 0, n = strlen( x[i] ); j < n / 2; j++)
        {
            char c = x[i][j];
            x[i][j] = x[i][n - j - 1];
            x[i][n - j - 1] = c;
        }
    }

    for (size_t i = 0; i < max / 2; i++)
    {
        char temp[N];
        strcpy( temp, x[i] );
        strcpy( x[i], x[max - i - 1] );
        strcpy( x[max - i - 1], temp );
    }
}

int main( void )
{
    char s[W][N] = { "Happy", "New", "Year" };
    size_t max = 3;

    for (size_t i = 0; i < max; i++)
    {
        printf( "%s ", s[i] );
    }

    putchar( '\n' );

    reverse( s, max );

    for (size_t i = 0; i < max; i++)
    {
        printf( "%s ", s[i] );
    }

    putchar( '\n' );
}

程序 output 是

Happy New Year
raeY weN yppaH

尽管将 function 拆分为两个函数会更好。 第一个反转字符串。 第二个反转二维字符数组的行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM