我正试图用以下代码编写一个小单元格:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_LEN 50
#define MAX_PARTS 50
int main ()
{
char* token;
char str[LINE_LEN];
char* arr[MAX_PARTS];
int i,j;
printf("Write a line: n $:");
fgets(str, LINE_LEN, stdin);
while (str != "quit") {
i=0;
token = strtok(str, " trn");
while( token != NULL )
{
arr[i] = token;
printf("'%s'n", arr[i]);
i++;
token = strtok(NULL," trn");
}
fflush(stdin);
printf("Write a line: n $:");
fgets(str, LINE_LEN, stdin);
}
return 0;
}
它工作正常,但事实上,当我键入"退出"时,程序不会结束。我想它一定与fgets有关,而且它在字符串str的末尾包含了EOF作为另一个字符,所以当我将其与"quit"进行比较时,它不是同一个字符串。我不知道从标准输入读取的字符串中提取字符的正确方法是什么。有人能帮我吗?
我想问的另一个问题是,在这段代码中使用fflush是否是个好主意。谢谢
我想它一定与fgets有关,而且它在字符串str的末尾包含了EOF作为另一个字符,所以当我将它与"quit"进行比较时,它不是同一个字符串。
没有。
首先,EOF
不是作为一个字符存在的,它只是一些IO函数返回的一个标志,告诉你在尝试读取文件时文件已经完成
fgets
在字符串中留下的是换行符(如果它因此而停止,而不是因为EOF或错误)。在获取字符串后,您可以很容易地将其移除(如果存在)
size_t l=strlen(str);
if(l && str[l-1]=='n')
str[l-1]=0;
但最重要的是,与"quit"
的比较是错误的。
如果编写str != "quit"
,则在str
和"quit"
之间执行指针比较,这将始终失败,因为str
和"quit"
是不同的字符数组,因此引用内存中的不同位置。您想要的是比较两个字符串的内容;在C中,这是用strcmp
:完成的
while(strcmp(str, "quit")!=0)
fgets
也将从下面的语句中读取newline
字符。。
fgets(str, LINE_LEN, stdin);
所以你有两个选项
使用以下条件比较"退出":
while (strcmp(str, "quitn"))
从输入中删除换行符。此处详细介绍
不能像str != "quit"
那样通过指针比较字符串
请改用0 != strcmp(str,"quit")
。
if(str[4] == 'n')
str[4] = ' ';
while (strcmp(str, "quit")!=0) {