这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char item[1000];
} itemset;
void additem(itemset* items,char* thing,unsigned long* numadded){
memcpy(items->item,thing,1000);
items++;(*numadded)++;
}
void showitems(itemset* items,unsigned long numitems){
itemset* p=items;
unsigned long count;
for (count=1;count<=numitems;count++){
printf("%d %s\n",count,p->item);p++;
}
}
int main(){
itemset* myitems=calloc(1,sizeof(itemset)*10);
itemset* itemstart=myitems;
unsigned long added=0;
additem(myitems,"Test",&added);
additem(myitems,"Test2",&added);
additem(myitems,"Test3",&added);
printf("Count=%d\n",added);
showitems(itemstart,added);
free(itemstart);
}
我试图在屏幕上看到运行此代码的内容是:
Count=3
1 Test
2 Test2
3 Test3
但相反,我明白了:
Count=3
1 Test3
2
3
因此我的additem功能无法正常工作。我发现修复是在每次函数调用后立即添加myitems++;
,但我试图在additem函数内部发生相同的行为,这样我就不必使用myitems++;
了功能。我还能做些什么来解决这个问题?
答案 0 :(得分:1)
使用#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char * argv[])
{
FILE *myfile;
myfile = fopen("Test.txt", "r");
char *numWords;
long n = strtol(argv[1], &numWords, 10);
if(argc != 2)
{
printf("Too Few Arguments");
}
else
{
char arr[n][100];
int i = 0;
while(fgets(arr[i],sizeof(arr),myfile)!=NULL)
{
arr[i][strlen(arr[i])-1] = '\0';
i++;
}
int total = i;
for(i = 0; i < total; ++i)
{
printf("%s\n", arr[i]);
}
fclose(myfile);
}
return 0;
}
的双指针,如下所示:
items
输出:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char item[1000];
} itemset;
void additem(itemset** items,char* thing,unsigned long* numadded){
memcpy((**items)->item,thing,1000);
(*items)++;
(*numadded)++;
}
void showitems(itemset* items,unsigned long numitems){
itemset* p=items;
unsigned long count;
for (count=1;count<=numitems;count++){
printf("%d %s\n",count,p->item);
p++;
}
}
int main(void){
itemset* myitems=calloc(1,sizeof(itemset)*10);
itemset* itemstart=myitems;
unsigned long added=0;
additem(&myitems,"Test",&added);
additem(&myitems,"Test2",&added);
additem(&myitems,"Test3",&added);
printf("Count=%d\n",added);
showitems(itemstart,added);
free(itemstart);
return 0;
}
另外,请检查:How to print an unsigned long int with printf in C?,表示您应该使用Count=3
1 Test
2 Test2
3 Test3
,而不是%lu
。
答案 1 :(得分:0)
我只是设法为我找到了一个有效的答案,那个刚刚回答的人也提出了类似的答案。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char item[1000];
} itemset;
void additem(itemset** items,char* thing,unsigned long* numadded){
memcpy((**items).item,thing,1000);
(*items)++;(*numadded)++;
}
void showitems(itemset* items,unsigned long numitems){
itemset* p=items;
unsigned long count;
for (count=1;count<=numitems;count++){
printf("%d %s\n",count,p->item);p++;
}
}
int main(){
itemset* myitems=calloc(1,sizeof(itemset)*10);
itemset* itemstart=myitems;
unsigned long added=0;
additem(&myitems,"Test",&added);
additem(&myitems,"Test2",&added);
additem(&myitems,"Test3",&added);
printf("Count=%d\n",added);
showitems(itemstart,added);
free(itemstart);
}
答案 2 :(得分:0)
你在添加项目功能中过度编写相同的指针。您需要将指针传递给指针才能使其工作。也可以使用strcpy进行字符串复制。并且对于showitems传递在calloc调用中分配的指针,因为它没有cahnge
答案 3 :(得分:-1)
您需要将items
传递给&#34;参考&#34;同样,不仅numadded
。或者可能会返回新指针。