我想使用管道来读取子进程中的字符串并将其发送给父进程,然后计算字符串中的字符数并显示数字。程序只运行直到我输入一个字符串。你能告诉我我做错了吗?
#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;
}
答案 0 :(得分:1)
使用strlen确定字符串的长度,然后使用for循环迭代到长度,如下所示:
this
答案 1 :(得分:0)
您可以使用strlen()
来确定任何以null结尾的字符串的长度;
在while (str[c] != "Done")
中,您将char与字符串文字进行比较。您应该使用strcmp()
或strncmp()
来比较字符串;
内圈(for(i=0; i<sizeof(str);i++) {...}
)正在使用str[c]
,但我相信你想要str[i]
,此外,循环不计算(c++
)当char不在[a,z]
区间时,你的外环可能永远不会结束;
你真的不需要嵌套循环。尝试类似:
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
。