将“String”拆分为C中的字符

时间:2014-09-16 07:42:26

标签: c string char

我正在学习C语言的初学者课程,并尝试围绕“字符串”。我以前用Java编程,所以有点混乱。

我想知道如何将“字符串”拆分为字符,以便能够删除某些字符。我为链表创建了代码,每个节点都有一个数据值,还有一个下一个指针(称之为node_line,因为它保存了行)。

typedef struct node {
    char *data;
    struct node *next;
} node_line;

这没有问题,我可以遍历整个列表并打印出每个元素:

void print_list(node_line head) {
    node_line * current = head;
    while(current != NULL) {
          printf("%s\n", current->data);
          current = current->next;
    }
}

但是,我在将 current->数据中的“字符串”转换为字符时遇到问题。也就是说,一次读一个字符。

例如,我想编写一个删除“字符串”中所有元音的程序。我在使用getc()函数读取文件时设法解决了这个问题。但是,我似乎无法使用current->中的文本这样做。数据。

    int c;
    while((c = getc(f)) != EOF) {
        //REMOVE
        if(c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || c=='y') {
            printf("");  //Remove the vowel
        }
        else {
            putchar(c); //Write out one character at the time.   
        }
    }

我想它就像:

while ((c = getc(current->data) != NULL) { ... }

非常感谢任何帮助,提示等!

2 个答案:

答案 0 :(得分:4)

getc用于从文件中读取。要访问char *缓冲区(字符串)中的字符,您通常会执行以下操作:

for (const char * p = current->data; *p != '\0'; ++p)
{
    char c = *p;
    if (c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || c=='y') {
       ...
    }
}

或者如果您更喜欢显式数组索引而不是指针:

const char * s = current->data;
for (int i = 0; i < strlen(s); ++i)
{
    char c = s[i];
    if (c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || c=='y') {
       ...
    }
}

答案 1 :(得分:1)

void print_list(node_line head) {

应该是

void print_list(node_line *head) {

GETC:

  

返回内部文件位置当前指向的字符   指定流的指标。

那不是你想要的,使用指针算法:

char *s = current->data;

while (*s) {
    if(*s=='a' || *s=='e' || *s=='i' || *s=='o' || *s=='u' || *s=='y') {
        printf("");  //Remove the vowel
    }
    else {
        putchar(*s); //Write out one character at the time.   
    }
    s++;
}

或更好:

char *s = current->data;

while (*s) {
    if(*s!='a' && *s!='e' && *s!='i' && *s!='o' && *s!='u' && *s!='y') {
        putchar(*s); //Write out one character at the time.   
    }
    s++;
}