我目前正在进行“破解编码面试”的练习。即使这个问题的答案似乎在许多版本中。我无法正常工作。 我已经检查了stackoverflow中的其他版本,但是我无法找到差异或者是什么导致了我这个问题。
问题:它确实改变了'%20'的空格,但它不打印最后一个单词。
示例:
输入:“约翰史密斯先生
输出:“Mr%20John%20”
我告诉你我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Maximum sentence size + 1. */
#define MAX_SENTENCE_SZ 256
int amountOfSpaces(char* str){
int cnt=0;
while(*str!='\0'){
if(*str == ' '){
cnt++;
}
str++;
}
return cnt;
}
int main(){
char sentence[100]={'\0'};
/* Get the sentence, with size limit. */
fgets (sentence, MAX_SENTENCE_SZ, stdin);
/* Remove trailing newline, if there. */
if ((strlen(sentence)>0) && (sentence[strlen (sentence) - 1] == '\n'))
sentence[strlen (sentence) - 1] = '\0';
int cant = amountOfSpaces(sentence);
int newleng = sizeof(sentence) + cant*2;
char *ans = (char *)malloc(newleng+sizeof(char));
int pos=0;
for(int i=0; i<= sizeof(sentence)-1; i++,pos++){
if (sentence[i] == ' ') {
ans[pos] = '%';
ans[pos + 1] = '2';
ans[pos + 2] = '0';
pos += 3;
} else {
ans[pos] = sentence[i];
}
}
ans[pos+1]='\0';
printf("%lu\n", sizeof(sentence));
printf("%lu\n", sizeof(ans));
printf("%s",ans);
/* Free memory and exit. */
free (ans);
return 0;
}
答案 0 :(得分:1)
您的代码中存在多个错误
每次需要长度时都不要致电strlen
,它会计算长度,所以价格昂贵
sentenceLength = strlen(sentence);
/* Remove trailing newline, if there. */
if ((sentenceLength > 0) && (sentence[sentenceLength - 1] == '\0'))
sentence[--sentenceLength] = '\0';
int cant = amountOfSpaces(sentence);
您已经拥有字符串的长度,而sizeof sentence
是100
,这不是字符串的长度
int newleng = sentenceLength + 2 * cant;
你不需要施放malloc
,你需要一个额外的字符来终止'\ 0'
char *ans = malloc(1 + newleng);
size_t pos = 0;
由于您已经拥有长度,因此也使用相同的sizeof
错误
for(size_t i=0 ; i < sentenceLength ; i++, pos++){
if (sentence[i] == ' ') {
ans[pos] = '%';
ans[pos + 1] = '2';
ans[pos + 2] = '0';
您在每次迭代时都会递增pos
,所以在此递增2
pos += 2;
} else {
ans[pos] = sentence[i];
}
}
pos + 1
错了,你已经在循环中递增了它。
ans[pos] = '\0';
printf("%lu\n", sentenceLength);
printf("%lu\n", pos);
printf("%s",ans);
/* Free memory and exit. */
free (ans);
return 0;
完整的固定代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Maximum sentence size + 1. */
#define MAX_SENTENCE_SZ 256
int amountOfSpaces(char* str) {
int cnt=0;
while(*str!='\0') {
if(*str == ' ') {
cnt++;
}
str++;
}
return cnt;
}
int main(){
char sentence[100];
size_t sentenceLength;
/* Get the sentence, with size limit. */
fgets(sentence, sizeof(sentence), stdin);
sentenceLength = strlen(sentence);
/* Remove trailing newline, if there. */
if ((sentenceLength > 0) && (sentence[sentenceLength - 1] == '\0'))
sentence[--sentenceLength] = '\0';
int cant = amountOfSpaces(sentence);
int newleng = sentenceLength + 2 * cant;
char *ans = malloc(1 + newleng);
size_t pos = 0;
for(size_t i=0 ; i < sentenceLength ; i++, pos++) {
if (sentence[i] == ' ') {
ans[pos] = '%';
ans[pos + 1] = '2';
ans[pos + 2] = '0';
pos += 2;
} else {
ans[pos] = sentence[i];
}
}
ans[pos] = '\0';
printf("%lu\n", (unsigned long)sentenceLength);
printf("%lu\n", (unsigned long)pos);
printf("%s",ans);
/* Free memory and exit. */
free (ans);
return 0;
}
答案 1 :(得分:0)
......我无法找到导致我这个问题的原因。
开始使用调试器,熟悉它。
反正:
if (sentence[i] == ' ') {
ans[pos] = '%';
ans[pos + 1] = '2';
ans[pos + 2] = '0';
pos += 2; // <<<<< BUG HERE -- increment by 2 not 3
} else {
因为pos
在每次for
次迭代时已经增加1。
Btw:而不是使用sizeof(sentence)
存储变量中字符串的实际长度并使用:
int l = strlen(sentence);
记住l
不会包含尾随空字符。