我尝试使用相同的结果将c
初始化为char c[2] = {'\0'};
,并使用相同的结果将strncpy((char *)c, tmp, 1);
更改为strncpy(c, tmp, 1);
。
还将strcat(tmp, (char *)c)
更改为strcat(tmp, c)
,结果相同。
我还尝试在c上使用memset()
,使用空字节,结果相同。它仍然按照10.10.5的预期执行,但也会在10.11.6上的字符串中添加??s?
。
我一直在练习一些C,并决定在工作中编写一个文本解析器。它从文件中读取数据,并根据传递给它的不同参数对其执行操作。一个选项是让它将文件中的所有文本转换为Pig Latin,它在OS X 10.10.5上工作正常,但我在家里展示了我的女朋友(OS X 10.11.6)(谁帮我从简易脚本迁移)语言Python / JS)它开始在每个单词的同一位置的字符之间放置随机字节。这是我10.10机器上的代码和输出。
的main.c
#include "parser.h"
int main(int argc, char *argv[])
{
if(argc < 2){err("Program Requires at Least One Argument.");}
if(argc > 6){err("Too many arguments.");}
int i = 1; // for indexing args (don't care about arg 0)
/* loop over the arguments to find any parameters
we don't look at last argument, as it should be
the file name */
for(i = 1; i < argc - 1; i++) {
if(strcmp(argv[i], "-v") == 0) {v = 1;}
else if(strcmp(argv[i], "-p") == 0) {p = 1;}
else if(strcmp(argv[i], "-c") == 0) {c = 1;}
else {err("Invalid Argument.");}
}
strcpy(flnm, argv[argc-1]);
parse(flnm);
return 0;
}
parser.c
void parse(const char *fn)
{
FILE *f = fopen(fn, "r");
if(!f) {err("File does not exist.");}
if(v == 1) {
while(xfscanf(f) != 0) {
vwlCnt(buff);
printf("%s\n", buff);
}
printf("File \"%s\" contains %d vowels.\n", fn, v_cnt);
}
if(p == 1) {
FILE *fp = fopen("out.txt", "w+");
if(!fp) {err("File write error.");}
while(xfscanf(f) != 0) {
pigLat(buff);
fputs(buff, fp);
}
fclose(fp);
}
if(c == 1 && v + p != 2) {
if(p == 1) {FILE *fp = fopen("out.txt", "r"); cat(fp);}
else {cat(f);}
}
fclose(f);
}
void pigLat(char *str)
{
int con = 0;
char *c[1];
char *tmp = TEMP(str);
switch(tmp[0]) {
case 'a':
case 'A':
con = 0;
break;
case 'e':
case 'E':
con = 0;
break;
case 'i':
case 'I':
con = 0;
break;
case 'o':
case 'O':
con = 0;
break;
case 'u':
case 'U':
con = 0;
break;
default:
con = 1;
break;
}
if(con == 1) {
printf("%c\n", tmp[0]);
strncpy((char *)c, tmp, 1);
for(int i = 0; i < sizeof(tmp); i++) {
tmp[i] = tmp[i+1];
}
strcat(tmp, (char *)c);
strcat(tmp, "ay ");
strcpy(buff, tmp);
} else {strcat(tmp, "ay "); strcpy(buff, tmp);}
printf("%s\n", tmp);
}
parser.h
#ifndef __parser_h__
#define __parser_h__
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
int p; // pig latin argument;
int v; // vowel count argument
int c; // cat arg
int v_cnt; // vowel count
char vwl; // vowel char
char flnm[64]; // file name
char buff[32]; // file scan buffer
void err(const char *msg); // error function
char *newTemp(char *str); // creates a 32B temp pointer on heap
int xfscanf(FILE *f); // simple fscan
void cat(FILE *f);
void parse(const char *fn); // file parsing function
void vwlCnt(char *str); // counts vowels in string
void pigLat(char *str); // pig latinize string
#define TEMP(X) newTemp(X)
#endif
输入文件
2016年里约奥运会还有不到一周的比赛时间,空荡荡的体育场座位似乎正在远离世界上一些最具装饰性的运动员。远远超过6%的88%。奥运会组织者周三表示,已在里约热内卢销售了数百万张门票。这比2012年的伦敦奥运会和2008年的北京奥运会要少,后者都卖出了96%的门票。但它比2004年雅典奥运会要好得多,雅典只有67%的活动门票被购买.Attendance一直很强大,比如巴西有望取得的体操和体育等大型活动,如足球和沙滩排球。尽管如此,在许多场地都可以看到大片空座位,尤其是在田径场地。
输出
ithWay esslay hantay oneay eekway ofay ompetitiioncay eftlay inay hetay 0162ay ioRay Olympicay埃姆斯,同性恋emptyay tadiumsay eatssay eemsay Otay的易趣tealingsay hetay potlighttsay awayay romfay omesay ofay hetay年世界&#39;摆动ostmay ecorateddday athletes.ay oSay arfay 8%8ay ofay hetay oremay hantay 6ay illionmay otaltay icketstay avehay eenbay oldsay inay ioRay eday aneiro,Jay Olympicay organizersay aidsay ednesdayy.Way hat&s; say esslay hantay hetay ondonLay amesGay inay 0122ay anday hetay eijingBay amesGay inay 008,2ay hichway othbay oldsay 6%9ay ofay heirtay ickets .tay utBay it&#39; uchmay etterbay hantay hetay 0042ay amesGay inay Athens,ay hereway ustjay 7%6ay ofay hetay eventay icketstay ereway urchasedd.pay attendanceay ashay eenbay trongsay orfay arqueemay eventsay uchsay asay ymnasticcsgay anday portssay inay hichway razilBay ashay eenbay expecteday otay excel,ay uchsay asay occersay anday eachbay olleyballl.vay until,Say argelay wathssay ofay emptyay eatssay ancay ebay een说atay anymay enues,vay ostmay otablynay atay hetay racktay anday ieldfay tadium.say
例如,在10.11.6上,seatssay
最终为seats?c?ay
或任何其他随机的几个字节。我不确定原因是什么,当我注意到这种行为但我无法找到解决方案时,我尝试更改了一些代码,我只是把它变得更糟。
我没有包含整个parser.c
文件,因为其他功能不相关。 xfscanf
只执行fscanf
,如果达到EOF
,则返回0。 *newTemp
从传递给它的字符串创建一个临时字符串,返回一个指向该字符串的新副本的指针,这样原始元素就不会被元音计数功能所破坏(我用X替换元音)在那个功能)。
任何帮助或指导都会非常感激,为什么它的表现如此!
答案 0 :(得分:0)
问题似乎是Google用户在评论中提出更改后未正确同步的结果。代码现在可以使用这些更改:
重组pigLat
以使用While-Loop而不是For-Loop
int i = 0;
while(tmp[i] != '\0') {
tmp[i] = tmp[i+1];
i++;
}
确保空字节不会被移动到不应移动的位置,而sizeof(tmp)不会返回实际大小,仅定义为32B
已初始化c
char c[2] = {'\0'};
程序现在按预期工作。