gpt4 book ai didi

c - K&R 执行官。 1-23 : Some Complications

转载 作者:行者123 更新时间:2023-11-30 16:56:18 25 4
gpt4 key购买 nike

“练习 1-23。编写一个程序来删除 C 程序中的所有注释。不要忘记处理带引号的字符串和字符常量适本地。 C 注释不能嵌套。”K&R pg.34

基本上,我有两个问题:

1)我是全新的编码者,我想知道我是否至少以正确的方式思考这个问题。

2) 代码的构建是为了忽略 // 直到 \n/* 直到 */ 。但是无论 /* 注释它总是留下一个 /

<小时/>

输入: abc/*comment*/123

输出: abc/123

<小时/>

输入: abc/*123

输出: abc/

<小时/>
#include <stdio.h>
char s[1000]; //Principal array
int countS; //Number of char in array

int deletSingleLineComments(void);
int deletMultiLineComments(void);

int main(void){
int c;
while((c=getchar())!=EOF){
s[countS]=c;
++countS;
}

deletMultiLineComments(); //Function 1
deletSingleLineComments(); //Function 2

printf("\ns[]=\n%s\n\ncountS[]=%d\n",s,countS);
}



//Functions 1
int deletMultiLineComments(void){
char t[1000];
int i=0;
int inComment=0;
int diff=0;
int a,b,c;

while(i<=countS){
t[i]=s[i];
++i;
}
i=0;

while(i<=countS){

if(t[i]=='/' && t[i+1]=='*'){
inComment=1;
}

if(inComment==1){
++diff; //to equilibrate the number
}

if(inComment==0){
s[i-diff]=t[i];
}

if(t[i]=='*' && t[i+1]=='/'){
inComment=0;
}
++i;
}
s[i-diff+1]='\0';
countS=i-diff;

printf("\nt[]=\n%s\n",t);
}



//Function 2
int deletSingleLineComments(void){
int i=0;
char t[1000];
int inComment=0;
int diff=0;

while(i<=countS){
t[i]=s[i];
++i;
}
i=0;

while(i<=countS){

if(t[i] == '/' && t[i+1] == '/'){
inComment=1;
}

if(t[i]=='\n'){
inComment=0;
}

if(inComment==1){
++diff;
}

if(inComment==0){
s[i-diff]=t[i];
}
s[i-diff+1]='\0';
++i;
}
countS=i-diff;
}

谢谢。

最佳答案

while(i<=countS){ t[i]=s[i];... }

请注意,字符串是从零开始的。例如"ABC"长度3 ,它从零索引开始,最后一个有效索引是 2 (不是 3 )。因此,您应该将条件更改为 i < string_length

while(i < countS){ t[i]=s[i];... }

访问 t[i+1] 时也要小心,因为同时i有效,i+1可能会超出范围。

if (i < (countS - 1))
if(t[i]=='/' && t[i+1]=='*')

为了将一个字符串分配给另一个字符串,您可以引入第二个变量 k ,并增加 k每次作业后。 (在我看来)此方法比使用 diff 更容易变量并进行加法和减法。

此外,而不是 char t[1000]; ,您可以使用char *t = malloc(countS);声明一个长度为 countS 的临时变量,那么最后必须用 free(t) 释放它。如果你的编译器支持变长数组,你可以直接输入 char t[countS] .

示例:

char s[1000]; //Principal array
int countS; //Number of char in array

//Functions 1
void deletMultiLineComments(void)
{
char *t = malloc(countS);
int i = 0;
int k = 0;
int inComment = 0;

while (i < countS)
{
t[i] = s[i];
++i;
}

i = 0;
while (i < countS)
{
if (i < countS - 1)
if (t[i] == '/' && t[i + 1] == '*')
{
inComment = 1;
i+=2;
continue;
}

if (inComment == 1)
{
if (i < countS - 1)
if (t[i] == '*' && t[i + 1] == '/')
{
inComment = 0;
i+=2;
continue;
}
}

if (inComment == 0)
{
s[k] = t[i];
k++;
}

++i;
}

free(t);
s[k] = '\0';
countS = k;

printf("mulitline comment removed %s\n", s);
}

//Function 2
void deletSingleLineComments(void)
{
char *t = malloc(countS);
int i = 0;
int k = 0;
int inComment = 0;

while (i < countS)
{
t[i] = s[i];
++i;
}

i = 0;
while (i < countS)
{
if (i < countS - 1)
if (t[i] == '/' && t[i + 1] == '/')
{
inComment = 1;
i += 2;
continue;
}

if (t[i] == '\n')
{
inComment = 0;
}

if (inComment == 0)
{
s[k] = t[i];
k++;
}

i++;
}
free(t);
s[k] = '\0';
countS = k;

printf("single comment removed %s\n", s);
}

int main(void)
{
//get input
scanf("%s", s);

countS = 0;
while (s[countS]) countS++;

deletMultiLineComments(); //Function 1
deletSingleLineComments(); //Function 2
}

关于c - K&R 执行官。 1-23 : Some Complications,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39950048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com