繁体   English   中英

从c中的字符串中删除前导空格

[英]remove leading spaces from string in c

我正在逐个字符地读取字符串,然后为找到的每个单词(以空格分隔)计算每个单词的长度,最后将所有信息打印到屏幕上。

Sample run: trickier to master

    n=8, s=[trickier]
    n=2, s=[to]
    n=6, s=[master]
    n=0, s=[]
    n=-1, s=[]

这是正确的,我得到的是:

    n=0, s=[]
    n=0, s=[]
    n=8, s=[trickier]
    n=2, s=[to]
    n=0, s=[]
    n=6, s=[master]
    n=0, s=[]
    n=-1, s=[]

问题是字符串中的前导空格 我看过很多关于如何修剪前导空格的示例,但我无法使用当前的源代码。

代码:

#include "getword.h"

int getword(char *w) {
    int iochar;
    int index = 0;
    int numberofchars = 0;

    if (numberofchars == 0 && iochar == '\n') {
        w[index] = '\0';
        iochar = EOF;
        return 0;
    }
    if (iochar == EOF && numberofchars == 0) {
        w[index] = '\0';
        return -1;
    }

    while ((iochar = getchar()) != EOF) {
        if (iochar != ' ' && iochar != '\n') {
            w[index] = iochar;
            index++;
            numberofchars++;
        } else {
            w[index] = '\0';
            if (strcmp(w, "done") == 0) {
                return -1;
            } else {
                return numberofchars;
            }
        }
    } //after while loop
} // end of function

int main() {
    int c;
    char s[STORAGE];

    for (;;) {
        (void)printf("n=%d, s=[%s]\n", c = getword(s), s);
        if (c == -1)
            break;
    }
} 

代码太复杂了,一些无用和虚假的测试会产生未定义的行为:

  • 在使用getchar()阅读之前在getword()测试iochar是没有意义的。
  • 在单个printf()调用中组合读取、测试和写入单词也是虚假的:你应该读取,然后测试,如果没有完成则输出。

这是一个简化版本:

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

#define STORAGE 50

// read a word into an array of size `size`.
// return the number of characters read.
int getword(char *w, size_t size) {
    int c;
    size_t i = 0;

    while (i + 1 < size && (c = getchar()) != EOF) {
        if (c == ' ' || c == '\t' || c == '\n') {
            if (i == 0)
                continue;  // ignore leading spaces
            else
                break;     // stop on white space following the word.
        }
        w[i++] = c;
    }
    w[i] = '\0';
    return i;
}

int main() {
    char s[STORAGE];
    int len;

    while ((len = getword(s, sizeof s)) != 0) {
        if (!strcmp(s, "done"))
            break;
        printf("n=%d, s=[%s]\n", len, s);
    }
    return 0;
}

我试图让代码产生所需的输出,但这就是我所能做的。 有一些我认为的错误,所以我修复了它们。 有关更多详细信息,请参阅代码中的注释。 希望能解决问题。

int getword(char * w) {
    int iochar = 0;
    int index = 0;
    int numberofchars = 0;

    // I really don't know why those if conditions were required
    // Thought they were useless so removed them

    while ((iochar = getchar()) != EOF) {
        if (iochar != ' ' && iochar != '\n') {
            w[index++] = iochar;   // slight change here
            numberofchars++;
        } else {
            w[index] = '\0';
            // I don't know what this condition is supposed to mean
            // so I ignored it
            if (strcmp(w, "done") == 0) {
                return -1;
            } else {
                return numberofchars;
            }
        }
    } //after while loop

    // Since EOF is encountered, no more characters to read
    // So terminate the string with '\0'
    w[index] = '\0';

    // Here after the loop you should check if some characters were read, but not
    // handled. If there are any, return them because that's what you last read
    // before EOF was encountered
    return (numberofchars > 0 ? numberofchars : -1);
} // end of function



int main()
{
    int c;
    char s[STORAGE];

    for (;;) {
        // Put the if condition before printing because if -1 is returned
        // it doesn't make sense to print the string at all
        c = getword(s);
        if (c == -1) break;
        printf("n=%d, s=[%s]\n", c, s);
    }
}

这是我测试的地方: http : //ideone.com/bmfaA3

暂无
暂无

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

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