感谢您的时间。我提前道歉我是C编程的新手,并在堆栈溢出时发布。我可能遗漏的任何信息和您提出的问题请询问。
我有这个实验室,我正在为我的班级工作,而我却无法理解可怕的指针是如何运作的。首先,我将解释实验室说明。
首先,我要为null创建一个200字的数组,最大长度为30 + 1。 接下来,我需要创建的调用函数包括:
我使用的IDE是Dev C ++,它很不稳定所以我也一直在使用netbeans。 我只尝试创建读取,打印和转换为小写函数。我首先尝试读取文件并在main中打印数组。我正在阅读的文件是由我创建的,它包含一个完整的短句:
编辑 - 将主代码更新为当前主内部的小写循环。
#define rows 200 //How many words allowed in array.
#define cols 31 //How many characters allowed for each word.
void lowercase(char* words, int count);
int read(char (*words)[cols]);
void print(char (*words)[31], int count);
int main(int argc, char *argv[]){
char words[rows][cols];
int i, j;
int count = read(words);
print(words, count);
/*
//make words lowercase
for(i = 0;i<count;i++){
for(j = 0;j<cols;j++){
if(words[i][j]!=0){
if(words[i][j]<91 && words[i][0]>64)
words[i][j] = words[i][j]+32;
}
}
}*/
for(i = 0;i < count;i++){
lowercase(*words+i, count);
}
print(words, count);
return 0;
}
代码写得不好并且管理得当,我只是想让一切工作先行,然后才会更合适。第一个printf输出结果如何:
数组[0]:有
数组[1]:ARE
数组[2]:所以
数组[3]:很多
数组[4]:单词
数组[5]:在
中数组[6]:这里
然后打印功能我在数组中正确打印出单词,但它包含每个单词的所有30个空格而不是单词。这就是它的编写方式我需要改变它。
void print(void *array, int SIZE){
int i,
j;
char *charArray = (char *) array;
for( j = 0; j < SIZE; j++ ){
for( i = 0; i < SIZE; i ++){
printf( "%c ", charArray[j*SIZE + i] );
}
printf( "\n" );
}
}
我创建的tolower函数部分地将每个单词的第一个字母转换为小写。现在它破了,不记得我改变了什么。
EDIT-更新小写功能。 main中的小写字母完全正常工作,但是使用此功能时,它不会将所有单词转换为小写,而是在第三个单词处停止,其余单词则相同。
void lowercase(char *words, int count){
int j;
for(j = 0;j<cols;j++){
if(words[j]!=0){
if(words[j]<91 && words[j]>64)
words[j] = words[j]+32;
}
}
}
我试图将main中的读取代码移动到它自己的函数中,同时尝试使用指针模拟打印代码但是当我运行程序时它停止并且exe文件停止工作窗口弹出命令提示符。 IDE中没有错误或警告。
int read(void *array){
FILE *file;
int i,
j;
char *words = (char *) array;
file = fopen("words.txt", "r");
//STORE IN ARRAY
for(i=0;i<7;i++)
fscanf(file,"%s", words[i]);
}
如果你还没弄明白我不知道何时或如何使用指针或地址。基本上12小时我基本上都学过C语言,在我看来,没有足够的时间学习语言,特别是有效地理解语言。任何帮助将不胜感激。谢谢。
答案 0 :(得分:2)
通过将二维数组向下投射到char*
,您丢失了一些信息。如果您正确读取了单词,那么在内存中,您的数组可能如下所示:
0 10 20 30
|.........|.........|.........|.
There
ARE
so
MANY
words
in
HERE
要访问words[1]
,编译器会自动从数组的开头偏移31个字节。
你的问题是,在你将words
转换为char*
之后,编译器不再知道2D结构,而words[1]
现在只会偏离开始时的1个字节。阵列。
一个简单的解决方案是重新定义read
函数:
int read(char words[][31])
{
FILE *file;
int i, j, count = 0;
file = fopen("words.txt", "r");
for (i=0; i<7; i++)
{
count += (1 == fscanf(file, "%s", words[i]));
}
return count;
}
现在编译器知道words[i]
的内存跨度大小是31 char
值。
与print
类似的事情:
void print(char words[][31], int count)
{
int i;
for( i = 0; i < count; i ++)
{
printf( "%s\n", words[i] );
}
}
答案 1 :(得分:2)
像这样解决:
#include <stdio.h>
#include <stdlib.h>
//Stringification
#define S_(n) #n
#define S(n) S_(n)
//Information to be shared across the whole area
#define MAX_ROWS 200
#define MAX_WORD_LENGTH 30
#define COLS (MAX_WORD_LENGTH + 1)
#define DATA_FILE "words.txt"
int read(void *array);
void print(void *array, int rows);
int main(void){
char words[MAX_ROWS][COLS];
int rows;
rows = read(words);
print(words, rows);
return 0;
}
int read(void *array){
FILE *file = fopen(DATA_FILE, "r");
if(file == NULL){
perror("fopen:");
exit(EXIT_FAILURE);
}
char *words = array;
int rows;
for(rows = 0; rows < MAX_ROWS; ++rows, words += COLS){
if(fscanf(file, "%" S(MAX_WORD_LENGTH) "s", words) == EOF)
break;
}
fclose(file);
return rows;
}
void print(void *array, int rows){
char *words = array;
for(int r = 0; r < rows; ++r, words += COLS){
printf("Array [%d]: %s\n\n", r, words);
}
}