我有一個程序,需要7個參數。現在第一個參數被忽略。我的主要函數fcfsa需要8個參數:s1,s2,x1,y1,z1,x2,y2,z2。 s1和s2是char指針變量,x1..z2是argv中連續順序的最後6個整數參數。我的字符串生成程序有什麼問題?
fcfsa應該這樣做: 第一個字符串s1將包含一個x1 R,後跟y1 w's,然後是z1 R's。 第二個字符串s2由x1 r's,後面是x2 R,後面跟着y2 w's,後面跟着z2 R's組成。
但是,當使用./main執行程序時,我沒有得到正確的輸出。0 4 2 7 3 6 5 現在再次忽略第一個參數0。
這是我的輸出:
inputs: 0 4 2 7 3 6 5
maxSize=27
Part 1
RRRRwwRRRRRRRRRRRR+Y?
rrrrRRRwwwwww
0 4 2.0 0.86364
和我的main.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pslibrary.h"
void part0(char *s1, char *s2);
void display(char *heading, char *s1, char *s2);
void fcfsa(char *s1, char *s2, int x1, int y1, int z1, int x2, int y2, int z2);
int main(int argc, char **argv) {
int i;
printf("Assignment 0 program was written by Marcus Lorenzana\n");
if (argc != 8) {
printf("Error. Wrong number of arguments\n");
return 1;
}
printf("inputs: ");
for (i = 1; i < 8; i++) {
printf("%s ",argv[i]);
}
printf("\n");
//Get maximum string size
int maxSize=0;
for (i = 1; i < 8; i++) {
maxSize+=atoi(argv[i]);
}
printf("maxSize=%d\n",maxSize);
char str1[maxSize],str2[maxSize];
fcfsa(str1,str2,atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),atoi(argv[5]),atoi(argv[6]),atoi(argv[7]));
display("Part 1\n",str1,str2);
return 0;
}
而且我包含程序fcfsa:
#include <stdio.h>
#include <string.h>
#include "pslibrary.h"
void part0(char *s1, char *s2){
strcpy(s1,"RRwwwwwRRRRRRRRR");
strcpy(s2,"rrRRRRwwwwwwwwrrRRRRRRR");
}
void display(char *heading, char *s1, char *s2){
printf("\n");
printf("%s\n",heading);
printf("%s\n",s1);
printf("%s\n",s2);
printf("\n");
int s1len = strlen(s1);
int s2len = strlen(s2);
int i,s1cnt,s2cnt,s1cnt2,s2cnt2;
s1cnt=s2cnt=0;
s1cnt2=s2cnt2=0;
for (i = 0; i < s1len; i++) {
if (s1[i]=='r')
s1cnt++;
}
for (i = 0; i < s2len; i++) {
if (s2[i]=='r')
s2cnt++;
}
float average_r = (s1cnt+s2cnt)/2;
for (i = 0; i < s1len; i++) {
if (s1[i]=='R')
s1cnt2++;
}
for (i = 0; i < s2len; i++) {
if (s2[i]=='R')
s2cnt2++;
}
int longest;
if (s2len > s1len) {
longest = s2len;
} else {
longest = s1len;
}
float average_R = (float)(s1cnt2+s2cnt2)/longest;
printf("%d %d %.1f %.5f\n",s1cnt,s2cnt,average_r,average_R);
}
void fcfsa(char *s1, char *s2, int x1, int y1, int z1, int x2, int y2, int z2){
//s1: x1 R's, y1 w's, 0 or more r's, z1 R's
//s2: x1 r's, x2 R's, y2 w's, 0 or more r's, z2 R's
int i;
//s1 fill
int s1_start=0;
int s1_end=x1;
for (i = s1_start; i < s1_end; i++) {
s1[i]='R';
}
s1_start=s1_end;
s1_end+=y1;
for (i = s1_start; i < s1_end; i++) {
s1[i]='w';
}
s1_start=s1_end;
s1_end+=z1;
for (i = s1_start; i < s1_end; i++){
s1[i]='R';
}
s1[s1_end]='\0';
//printf("s1:%s\n",s1);
//s2 fill
int s2_start=0;
int s2_end=x1;
for (i = s2_start; i < s2_end; i++) {
s2[i]='r';
}
s2_start=s2_end;
s2_end+=x2;
for (i = s2_start; i < s2_end; i++) {
s2[i]='R';
}
s2_start=s2_end;
s2_end+=y2;
for (i = s2_start; i < s2_end; i++) {
s2[i]='w';
}
s2_start=s2_end;
s2_end+=z2;
for (i = s2_start; i < s2_end; i++) {
s1[i]='R';
}
s2[s2_end]='\0';
//printf("s2:%s\n",s2);
}
編譯所有警告和調試信息(如:'GCC -Wall -g')然後**我們e調試器**(例如'gdb') – 2014-09-10 17:04:33
你可能想嘗試自己調試它。在這裏閱讀如何做到這一點:http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – alk 2014-09-10 17:06:15
當你想附加第二批時,你在'fcfsa'中有's1' 'R's。只有一個函數可以調用兩次,也就是每個字符串一次('s'的'r'爲零')。 – 2014-09-10 17:11:13