【问题标题】:How to read first character of a String in C如何在C中读取字符串的第一个字符
【发布时间】:2015-06-29 12:16:49
【问题描述】:

给定 C 中的字符串 "Hello",返回字符串中的 "H" 的方法会是什么样子。

然后,一旦我确定了如何做到这一点,我想更进一步,从初始字符串中删除第一个字符,以便下次我阅读它时 "Hello" 变为 "ello",当我再次调用 read 方法时,它会返回"e"?

我知道如何用其他语言(如 Java)来做到这一点,但我对 C 语言的熟练程度不高,所以我真的在为这个概念苦苦挣扎。

这是我在 java 中的做法。

public class Program1 {

private String expression = "-(1+3)*4/6";

public String cut_string(String word)
{

    String temp = word.substring(1, word.length());
    return temp;
}

public char readToken()
{
    if(expression.length() > 1)
    {
        char token = expression.charAt(0);
        expression = cut_string(expression);
        return token;
    }else {
        System.out.print("BROKEN AT READ TOKEN");
        return ' ';
    }

}

public String getExpression()
{
    return expression;
}

public static void main(String [] args)
{
    Program1 thing = new Program1();


    System.out.println("The token was: " + thing.readToken()
            + "\n" + "The remaining String is: " 
                + thing.getExpression());

    System.out.println("The token was: " + thing.readToken()
            + "\n" + "The remaining String is: " 
                + thing.getExpression());

    System.out.println("The token was: " + thing.readToken()
            + "\n" + "The remaining String is: " 
                + thing.getExpression());               
}
}

输出如下:

The token was: -

The remaining String is: (1+3)*4/6

The token was: (

The remaining String is: 1+3)*4/6

The token was: 1

The remaining String is: +3)*4/6

【问题讨论】:

  • 欢迎来到 Stack Overflow!当您不仅发布您想要的内容,而且发布您已经尝试过的内容时,该网站的效果最佳。请发布您目前拥有的 C 代码以及似乎出了什么问题。
  • 我真的不知道从哪里开始。我希望这只是一个我忽略的简单解决方案。至少读取字符串的第一个字符的部分

标签: java c string loops char


【解决方案1】:

来自 Java,您应该记住,Java 意义上的“字符串”不是 C 的原生概念。在 C 中,您显式处理字符数组而不是更抽象的数据类型(除非您构建它们你自己)。将它们想象成类似于 Java 中的 char[]

然后,返回字符串的第一个字符与返回数组的第一个元素是相同的:

char first_character(char *string) {
    return(string[0]);
}

另一方面,改变程序的状态来“删除”字符串的第一个字符,在 C 语言中可能完全是多余的,这取决于你想怎么做。当然,您可以选择通过将所有元素移回一个位置来实际修改字符串,例如:

void remove_first_char(char *string) {
    int i;

    for(i = 0; string[i] != 0; i++)
        string[i] = string[i + 1];
}

(但请注意,字符串 literals 通常分配在只读内存中,无法修改。)

但是,根据您的上下文,您也可以非常简单地修改您可能正在使用的指针,使其仅指向第二个字符。

【讨论】:

    【解决方案2】:

    我希望 更喜欢 避免使用全局变量(尤其是在这种情况下,它正在被修改),但既然您似乎愿意忍受这一点,这可能是非常微不足道的:

    char expr[] = "-(1+3)*4/6";
    char *expression = expr;
    
    char read_token() { 
        return *expression++;
    }
    
    int main() { 
        char ch;
        while (ch=read_token()) {
            printf("next token: %c\n", ch);
            printf("The remaining string is: %s\n", expression);
        }
    }
    

    为了更好地封装一些东西,我会考虑更像这样的东西:

    #include <stdio.h>
    
    typedef struct {
        char *expression;
    } program1;
    
    char read_token(program1 *p) {
        return *p->expression++;
    }
    
    int main() {
        program1 p = { "-(1+3)*4/6" };
    
        char ch;
        while (ch = read_token(&p)) {
            printf("next token: %c\n", ch);
            printf("The remaining string is: %s\n", p.expression);
        }
    }
    

    至少在我看来,避免全局变量(除其他外)足以弥补额外的长度。

    【讨论】:

    • 看来您使用 program1 不带 struct 前缀或 typedef 的方式在其中添加了一点 C++。
    • @Dolda2000:糟糕。已更正。
    【解决方案3】:

    在 C 中,字符串存储为字符数组。

    char myStr[] = "String";
    

    您可以使用数组索引访问任何字符

    char myChar = myStr[0];
    printf("%c\n", myChar);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2014-11-22
      相关资源
      最近更新 更多