K&R C编程练习1-19

问题描述 投票:-1回答:4

赋值:编写一个反映字符串s的函数reverse(s)。用它来编写一个程序,一次调用一行代码

这是我尝试解决它:

#include <stdio.h>
#define MAXLINE 1000

int  getlinex(char line[], int maxline);

int main(){
    int len, j;
    char line[MAXLINE];
    char *temp;
    while ((len = getlinex(line, MAXLINE)) > 0) {
        for(j=0; j<=len; j++){
            temp = &line[len-j];
            line[j] = *temp ;
        }
        printf("%s", line);
    }
}

int getlinex(char s[], int lim) {
    int c, i;
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
        s[i] = c;
    }
    if (c == '\n') {
        s[i] = c;
        i++;
    }
    s[i] = '\0';
    return i;
}

第二版

int getlinex(char line[], int maxline);

int main(){
    int len,j;
    char line[MAXLINE];
    while ((len = getlinex(line, MAXLINE)) > 0) {
        for(j=0;j<=len;j++){
            reverse(&line,j,len);
        }
        printf("%s",line);
    }
}

void reverse( char *s[], int i, int len){
    s[i] = s[len-i];
}

int getlinex(char s[], int lim) {
    int c, i;
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
        s[i] = c;
    }
    if (c == '\n') {
        s[i] = c;
        i++;
    }
    s[i] = '\0';
    return i;
}

当我输入一串字符时,输出为空白。

我已经尝试返回一个char []数组但它只在main中不起作用我得对字符串进行处理。

问题出在哪儿 ?

c string char reverse kernighan-and-ritchie
4个回答
0
投票

考虑这个循环:

for(j=0;j<=len;j++){
    temp = &line[len-j];
    line[j] = *temp;
}

第一次通过,j0,所以temp设置为&line[len]。由于这指向\0的终止line字节,*temp\0。然后将其分配给line[j],即line[0]。之后会发生什么并不重要,因为line的第一个字节终止了字符串。

这就解释了为什么你会看到一个空字符串作为结果。但即使修复了这个特殊问题,字符串也会就地反转,所以一旦它到达字符串的中间,剩下的字符就会被覆盖并且不再可用。修复是交换字符对,而不是只复制一个字符。


0
投票

由于它是在赋值中编写的,因此您必须编写相应的函数。它可以看起来如下所示,因为它在示范程序中显示。

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

char * reverse( char *s )
{
    size_t n = strlen( s );

    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[n-i-1];
        s[n-i-1] = s[i];
        s[i] = c;
    }

    return s;
}

int main( void )
{
    char s[] = "Hello, World!";

    puts( s );
    puts( reverse( s ) );
}    

它的输出是

Hello, World!
!dlroW ,olleH

至于程序中的循环

         for(j=0;j<=len;j++){
            temp = &line[len-j];
            line[j] = *temp ;
            }

那没关系。例如,当j等于0时,循环体刚刚用line[0]中存储的字符覆盖&line[len],该字符等于字符串的终止零点。您需要将头部中的字符与字符串尾部的字符进行交换。

考虑到函数getlinex在字符串中包含新行字符。

  if (c == '\n') {
    s[i] = c;
    i++;
  }

也许你应该在反转它之前将它从字符串中删除。

例如

if ( line[len-1] == '\n' ) line[len-1] = '\0';

或者只是从函数if中删除上面显示的getlinex语句。


0
投票

下面是我在进行KnR练习时编写的代码。

#include <stdio.h>

/* exercise 1.19 */

#define MAXLEN 1000

int getline(char s[], int len);
void reverse(char s[]);

int
main(){
    int len;
    char line[MAXLEN];

    while ((len=getline(line,MAXLEN))){
        reverse(line);
        printf("%d - %s",len, line);
    }

    return 0;
}

/*
 * Reads a line from stdin
 */
int getline(char s[], int len){
    int c, i;

    for (i = 0; i < len -1 && (c=getchar()) != EOF && c != '\n'; ++i)
    s[i] = c;

    if (c == '\n'){
        s[i] = '\n';
        ++i;
    }

    s[i]='\0';
    return i;
} 


/*
 *  Reverses the order of chracters in string s
 */
void reverse(char s[]){
    int i, k;
    char tmp[MAXLEN];

    i = 0;
    /* copy the character string */
    while ((tmp[i] = s[i]) != '\0')
        ++i;

    --i; /* last character is nil */

    for (k = 0; k <= i ; ++k)
        s[k] = tmp[i-k];

    s[k] = '\0';
}

0
投票

以下是我的实施。它遵循功能风格。

#include <stdio.h>
#define MAXLINE 1000

int getline(char org[], int maxline);
void reverse(char rev[], char org[], int len);

int main(void) {
    char org[MAXLINE];
    char rev[MAXLINE];
    int len;
    while ((len = getline(org, MAXLINE)) > 0) {
        if (len > 0) {
            reverse(rev, org, len);
            printf("%s", rev);
        }
    }
    return 0;
}

int getline(char org[], int maxline) {
    int i = 0, c;
    for (i = 0; i < maxline - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
        org[i] = c;
    }
    if (c == '\n') {
        org[i] = '\n';
        i++;
    }
    org[i] = '\0';
    return i;
}

void reverse(char rev[], char org[], int len) {
    int i;
    for (i = 0; i < len; i++) {
        rev[len - i] = org[i];
    }
    rev[0] = '\b';
    rev[1] = '\b';
    rev[len + 1] = '\n';
    rev[len + 2] = '\0';
}
© www.soinside.com 2019 - 2024. All rights reserved.