此程序的控制台输出是按预期的,但写入文本文件的输出不反映此情况。我很确定这是因为y(++)的增加,但我不知道如何在不弄乱逻辑流的情况下解决问题,到目前为止我的尝试都不太成功。我一直在研究这个问题,所以如果你以前见过我,请原谅我的进展缓慢,我正在学习,我去了!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#define MAX_STR_LEN 120
int main(){
char *cArray[MAX_STR_LEN] = { "example", "dinosaurs" };
char cInput[MAX_STR_LEN] = { 0 };
int y = 0;
FILE *pWrite;
printf("Type your message:\n");
fgets(cInput, MAX_STR_LEN, stdin);
cInput[strlen(cInput) - 1] = 0; /* strip newline from input */
printf("\nInitialised string array:\n");
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
while (cArray[y]){
char * ptr = cInput;
while ((ptr = strstr(ptr, cArray[y])) != NULL){
char *ep = strchr (ptr, ' ');
if (ep) *ep = 0; /* null-terminate at space */
printf("%s\n", ptr);
if (ep) *ep = ' '; /* put the space back */
pWrite = fopen("test.txt", "a");
if ( pWrite != NULL ) {
fprintf(pWrite, "%s\n", ptr++);
fprintf(pWrite, "%s\n", asctime (timeinfo));
fclose(pWrite);
} else {
goto ErrorHandler; //there is a file i/o error
}
}
y++;
}
printf ( "Timestamp: %s", asctime (timeinfo) );
exit(EXIT_SUCCESS); //exit program normally
ErrorHandler:
perror("The following error occurred");
exit(EXIT_FAILURE); //exit program with error
}
控制台输出:
Type your message:
this is an example of dinosaurs
Initialised string array:
example
dinosaurs
Timestamp: Sat Mar 7 16:04:42 2015
Program ended with exit code: 0
文件输出:
example of dinosaurs
Sat Mar 7 16:04:42 2015
dinosaurs
Sat Mar 7 16:04:42 2015
预期的文件输出:
Initialised string array:
example
dinosaurs
Timestamp: Sat Mar 7 16:04:42 2015
答案 0 :(得分:1)
嗯,对于初学者来说,cArray [y]永远不会是NULL ..它是“示例”,“恐龙”,然后是未定义的。因此外部while循环可能会持续很长一段时间。我想你想明确定义
char *cArray[] = { "example","dinosaurs",NULL };
这可以保证外部while循环终止。但你问的真正问题实际上并不像你想象的那么糟糕。
首先,在printf到控制台之前,你明确地在字符串中添加了一个null终止符,但是在你写入文件之前你又删除了它:
将sting截断为一个单词:
char *ep = strchr (ptr, ' ');
if (ep) *ep = 0; /* null-terminate at space */
打印
printf("%s\n", ptr);
if (ep) *ep = ' '; /* put the space back */
当我们写入文件时,它再次显示完整的字符串:
pWrite = fopen("test.txt", "a");
if ( pWrite != NULL ) {
fprintf(pWrite, "%s\n", ptr++);
fprintf(pWrite, "%s\n", asctime (timeinfo));
fclose(pWrite);
所以当你把它写入文件“恐龙的例子”时,你会看到字符串的完整剩余部分。然后第二次,你看到恐龙就像你应该的那样,因为它恰好是弦乐的最后一个字。
接下来,每次通过内循环打印出日期戳。这就是日期戳显示两次的原因。此外,您根本不会将“初始化字符串数组”字符串写入文件(仅使用printf,而不是fprintf)。
希望有所帮助。