我正在制作一个C程序来计算符号;
和.
的出现次数,并显示文本文件每行的频率。
我的代码仅适用于dotcoma的一个符号计数器(计数;
),当我添加另一个计数器变量昏迷(计数.
)时,它会给我一个错误。
Stack arround varriable已损坏。
以下是完整代码:
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS /* Да си изключа предупрежденията*/
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>/* For exit() function */
int main()
{
char file_name[1000];
FILE *file2 = 0;
gets(file_name);
int rows = 1;//broq na vsichki redove
int dotcoma[150];//broq na ;
int coma[150];//broq na .
int j;
char c;
file2 = fopen(file_name, "r");//otvarq faial za chetene
if (file2 == NULL){
printf("Cannot open %s\n", file_name);
exit(2);
}//if
for (j = 0; j<150; j++)
dotcoma[j] = 0;
coma[j] = 0;
do{
c = fgetc(file2);
if (c == '\n') rows++;
else{
if (c == ';')
dotcoma[rows - 1]++;
if (c == '.')
coma[rows-1]++;
}
} while (c != EOF);//chete do kraq na faila
if (ferror(file2)){
printf("Error reading file.\n");
exit(2);
}//if
printf("The number of the symbols on a row ");
for (j = 0; j<rows; j++){
printf("Row %d: %f %f\n", j + 1, (float)dotcoma[j], (float)coma[j]);
}
_getche();
if (fclose(file2) == EOF){
printf("Cannot close %s\n", file_name);
exit(2);
_getche();
return 0;
}
}
答案 0 :(得分:0)
尝试修复coma
初始化!你忘了括号!
for (j = 0; j<150; j++){
dotcoma[j] = 0;
coma[j] = 0;
}
答案 1 :(得分:0)
在这里。
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS /* Да си изключа предупрежденията*/
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>/* For exit() function */
int main()
{
char file_name[1000];
FILE *file2 = 0;
gets(file_name);
int rows = 1;//broq na vsichki redove
int dotcoma[150];//broq na ;
int coma[150];//broq na .
int j;
char c;
file2 = fopen(file_name, "r");//otvarq faial za chetene
if (file2 == NULL){
printf("Cannot open %s\n", file_name);
exit(2);
}//if
for (j = 0; j<150; j++)
{
dotcoma[j] = 0;
coma[j] = 0;
}
do{
c = fgetc(file2);
if (c == '\n') rows++;
else{
if (c == ';')
dotcoma[rows - 1]++;
if (c == '.')
coma[rows-1]++;
}
} while (c != EOF);//chete do kraq na faila
if (ferror(file2)){
printf("Error reading file.\n");
exit(2);
}//if
printf("The number of the symbols on a row ");
for (j = 0; j<rows; j++){
printf("Row %d: %f %f\n", j + 1, (float)dotcoma[j], (float)coma[j]);
}
_getche();
if (fclose(file2) == EOF){
printf("Cannot close %s\n", file_name);
exit(2);
_getche();
return 0;
答案 2 :(得分:0)
return语句在if(fclose ...)里面,这意味着编译器会发出关于缺少return语句的警告
dotcoma和coma数组的初始化失败了,因为&#39;如果&#39;只处理一个代码块和昏迷[j] = 0;不在代码块内,这是始终围绕每个代码块放置{和}的另一个好理由
在DOS / Windows下,新行是两个字符,所以这一行:if(c ==&#39; \ n&#39;)显示&#39; c&#39;应该是一个int,而不是一个char关于这一行:FILE * file2 = 0; file2是一个指针,而不是一个整数,所以该行应该是:FILE * file2 = NULL;
为了避免编辑问题并简化将来的维护,这个神奇的数字&#39; 150应定义为&#39; #define MAX_COUNT(150)&#39;然后应该在所有情况下使用MAX_COUNT而不是文字150 应该对file_name
应用类似的注意事项函数:getchar()返回一个int值(因此可以识别EOF)所以这一行:&#39; char c;&#39;应该是&#39; int c;&#39;
exit()原型在stdlib.h中而不是conio.h
关于这一行:gets(file_name); gets()充满了安全问题和许多其他问题。它是从C语言折旧的。使用fgets()会更好,因为它限制了读取的字符数,因此不会发生输入缓冲区溢出。
#include <stdio.h>
#include <stdlib.h> /* For exit() function */
#include <string.h>
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS /* Да си изключа предупрежденията*/
#include <conio.h>
#endif
#define MAX_ROWS (150)
#define MAX_FILENAME_LEN (1000)
int main()
{
char file_name[MAX_FILENAME_LEN];
FILE *file2 = NULL;
if( NULL == fgets(file_name, MAX_ROWS, stdin)
{
perror( "fgets failed" );
exit( EXIT_FAILURE )
}
// implied else, fgets successful
int rows = 1;//broq na vsichki redove
int dotcoma[MAX_ROWS] = {0};//broq na ;
int coma[MAX_ROWS] = {0};//broq na .
int j; // index/loop counter
int c; // char input from console
if( NULL == (file2 = fopen(file_name, "r") )//otvarq faial za chetene
{
perror( "fopen failed for input file" );
exit(2);
}//if
// implied else, fopen successful
while( EOF != (c = fgetc(file2) )
{
switch( c )
{
case '\n':
rows++;
break;
case ';':
dotcoma[rows - 1]++;
break;
case '.':
coma[rows-1]++;
break;
default: // all other characters
break;
} // end switch
} // end while
printf("The number of the symbols on a row ");
for (j = 0; j<rows; j++)
{
printf("Row %d: %f %f\n", j + 1, (float)dotcoma[j], (float)coma[j]);
}
fclose( file2 );
getchar(); // wait for user to read screen and enter a char
return 0;
} // end function: main