我有这段代码C:
#define BUFSIZE 256
int main ( int argc, char *argv[])
{
int fdIn;
int fdOut;
if( argc != 3)
{
perror("Erro argument");
exit(1);
}
if( (fdIn = open(argv[1], O_RDONLY ) )<0)
{
perror("Errr pipe input");
exit(1);
}
if( (fdOut = open(argv[2], O_WRONLY ) )<0)
{
perror("Errr pipe output");
exit(1);
}
int c = 2;
while(c--)
{
char var1[BUFSIZE];
char var2[BUFSIZE];
char string[100];
memset(var1, 0, sizeof(var1));
memset(var2, 0, sizeof(var2));
memset(string, 0, sizeof(string));
if( readLine(fdIn, var1, sizeof(var1)) == 0)
{
printf("exit1\n");
exit(0);
}
printf("%s\n",var1);
if( readLine(fdIn, var2, sizeof(var2)) == 0)
{
printf("exit2\n");
exit(0);
}
removeNewLine(var1);
removeNewLine(var2);
if( atoi(var2) != 0){
if( atoi(var1) == 0 || (atoi(var1) % atoi(var2)) == 0 )
sprintf(string,"ok\n");
else
sprintf(string,"no\n");
}
printf("%s", string);
writeLine(fdOut, string, strlen(string));
}
close(fdOut);
close(fdIn);
exit(0);
}
代码中使用的函数:
int readLine( int fd, char* str, int bufferSize)
{
return readToDel(fd, '\n', str, bufferSize);
}
int readToDel( int fd, char delimiter, char* str, int bufferSize)
{
int n;
int byteLetti =0;
int index=0;
do /* Read characters until NULL or end-of-input */
{
if( (n = read (fd, str+index, 1)) < 0)
{
perror("Errore: lettura dal file descriptor fallita\n");
exit(1);
}
byteLetti+=n;
}
while (n > 0 && *(str+index++) != delimiter && index < bufferSize);
return byteLetti; /* Return false if end-of-input */
}
void removeNewLine( char *s )
{
removeDel(s, "\r\n");
}
void removeDel( char *s, char *del)
{
s[strcspn ( s, del )] = '\0';
}
我有两个管道用于输入,另一个用于输出。我在输入管道上写入,使用echo "4\n2\n" > i
(通过终端)字符串"4\n2\n"
和两个readline(如果在while循环中为2)我应该读取“4”然后通过第二个readline“ 2" 。这是因为Readline
函数按'\ n'分割;但是当第一个结束时,如果在while循环中打印var1
(应该只包含"4"
),但它打印4\n2\n
,我不明白为什么。
我错了什么?
答案 0 :(得分:1)
\n
实际上不是换行符。这是一个转义序列, 在某些情况下 被解释,并导致解释器替换换行符。 C编译器在字符串和字符文字中进行这种解释和替换,因此编译的程序实际上包含换行符。
shell及其echo
内置命令不一定执行此解释。默认情况下,OS X附带的bash
不会解释此类转义序列。您可以通过传递-e
选项来实现。请注意,/bin/echo
或其他shell的内置echo
命令可能不支持该选项。
因此,您可以在程序中提供输入字符流4
,换行符,2
,换行符,换行符。您实际提供的内容包括4
,\
,n
,2
,\
,n
,换行符。