用%20替换空格,但不打印最后一个单词

时间:2014-12-21 23:06:56

标签: c

我目前正在进行“破解编码面试”的练习。即使这个问题的答案似乎在许多版本中。我无法正常工作。 我已经检查了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;
  }

2 个答案:

答案 0 :(得分:1)

您的代码中存在多个错误

  1. 每次需要长度时都不要致电strlen,它会计算长度,所以价格昂贵

    sentenceLength = strlen(sentence);
    /* Remove trailing newline, if there. */
    if ((sentenceLength > 0) && (sentence[sentenceLength - 1] == '\0'))
        sentence[--sentenceLength] = '\0';
    
    int cant = amountOfSpaces(sentence);
    
  2. 您已经拥有字符串的长度,而sizeof sentence100,这不是字符串的长度

    int newleng = sentenceLength + 2 * cant;
    
  3. 你不需要施放malloc,你需要一个额外的字符来终止'\ 0'

    char *ans = malloc(1 + newleng);
    size_t pos = 0;
    
  4. 由于您已经拥有长度,因此也使用相同的sizeof错误

    for(size_t i=0 ; i < sentenceLength ; i++, pos++){
        if (sentence[i] == ' ') {
            ans[pos] = '%';
            ans[pos + 1] = '2';
            ans[pos + 2] = '0';
    
  5. 您在每次迭代时都会递增pos,所以在此递增2

            pos += 2;
        } else {
            ans[pos] = sentence[i];
        }
    }
    
  6. pos + 1错了,你已经在循环中递增了它。

    ans[pos] = '\0';
    
    printf("%lu\n", sentenceLength);
    printf("%lu\n", pos);
    printf("%s",ans);
    /* Free memory and exit. */
    free (ans);
    return 0;
    
  7. 完整的固定代码

    #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不会包含尾随空字符。