读取C中字符串中的字符数

时间:2015-12-05 17:00:44

标签: c string count pipe fork

我想使用管道来读取子进程中的字符串并将其发送给父进程,然后计算字符串中的字符数并显示数字。程序只运行直到我输入一个字符串。你能告诉我我做错了吗?

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

#define SIZE 1024


int main()

{

int i,n,x;
char msg[SIZE];  
char str[SIZE]; 



int p3[2];

pipe(p3);

int pid=fork();


if(pid==0){


close(p3[0]); //closing read end

printf("Enter a string\n");
fgets(msg,SIZE,stdin);

write(p3[1],msg,sizeof(msg)); //writting into pipe
close(p3[1]); //closing write end


}

else {

close(p3[1]); //close write end

read(p3[0], str, sizeof(str)); 

int c = 0;

while (str[c] != "Done")
   {
 for(i=0; i<sizeof(str);i++){
      if (str[c] >= 'a' && str[c] <= 'z') {
          c++;
}
   }
}

printf("%d letters\n", c); 
}

return 0;
}

2 个答案:

答案 0 :(得分:1)

使用strlen确定字符串的长度,然后使用for循环迭代到长度,如下所示:

this

答案 1 :(得分:0)

  1. 您可以使用strlen()来确定任何以null结尾的字符串的长度;

  2. while (str[c] != "Done")中,您将char与字符串文字进行比较。您应该使用strcmp()strncmp()来比较字符串;

  3. 内圈(for(i=0; i<sizeof(str);i++) {...})正在使用str[c],但我相信你想要str[i],此外,循环不计算(c++)当char不在[a,z]区间时,你的外环可能永远不会结束;

  4. 你真的不需要嵌套循环。尝试类似:

  5. const char *ptr = str;
    size_t index = 0; // An index to access str - just to help you.
    
    // Iterate over ptr, one character at a time, until we find the null terminator.
    while (*ptr != '\0') {
        // Read 4 chars from ptr and check if it's "Done"
        if (strncmp(ptr, "Done", 4) == 0)
            break;
    
        // Do something here. For example:
        // if (str[index] >= 'a' && str[index] <= 'z')
        //     lowercase_counter++;
        // if (str[index] >= 'A' && str[index] <= 'Z')
        //     uppercase_counter++;
        // if (str[index] >= '0' && str[index] <= '9')
        //     number_counter++;
        // NOTE: str[index] is equivalent to *ptr, thus you can use one or another.
    
        ptr++;
        index++;
    }
    

    确保不要在其他地方增加ptr - 这个想法是每次循环迭代检查单个字符 - 您仍然可以使用strcmp或其他任何内容进行预读,就像我们为&#34;完成&#34 ;.如果您这样做,请注意不要在ptr边界之外访问str