2016-12-02 61 views
1

我的问题是我有一个输入说:交换C中某个单词的字符串位置?

# ## abC### 

和我的输出应该是:

### abC# ## 

我要做的就是通过输入我环路,每当我发现英文单词前一个字符,英文单词和英文单词之后的字符在以前初始化的阵列中使用我的算法的以下部分:

char before[before_size],after[after_size],word[word_size]; 
word_found = 0; 
if(flag == 1){ 
    for(j = 0;j<strlen(word_arr);j++){ 
     if(isalpha(*(word_arr+j)) == 0 && word_found == 0){ 
      before[b_counter] = *(word_arr+j); 
      b_counter++; 
      //"I am inserting elements in the before array!\n"); 
     }else if(isalpha(*(word_arr+j)) != 0){ 
       word[word_counter] = *(word_arr+j); 
       word_found = 1; 
       word_counter++; 
       //"I am inserting elements in the word array!\n"); 
     }else if(isalpha(*(word_arr+j))== 0 && word_found == 1){ 
       after[a_counter]= *(word_arr+j); 
       a_counter++; 
       //"I am inserting elements in the after array!\n"); 
     } 
    } 
    printf("%s %s %s",after,word,before); 
} 

word_arr基本上是用户输入。 但输出歪斜,因为这是我得到的输出:

###> abc > # ## r"[email protected] # ## abC### 

什么是那些垃圾计算机输出在哪里他们来自?

回答

2

计算机输出的是什么垃圾?

这是从字符串初始化部分字符的字符数组beforewordafterprintf%s不知道初始化部分结束的位置,所以它继续直到找到'\0'字符。

它们从哪里来?

原因是缺少空终止符。在循环之后添加它们如下:

before[b_counter] = '\0'; 
word[word_counter] = '\0'; 
after[a_counter] = '\0'; 
+0

是的,它可以解决奇怪的字符弹出!我的另一个担心,现在的输出是 ## abc# 在非常乞讨的句子中有一个空格,因为我将它包含在我的“After”数组中。任何想法如何删除它,使我的输出从一开始就有一个空间开始? –

+1

,因为您想要在每个字符串(char-array)的末尾添加一个额外的字符,您必须为每个字符串(char-arrays)分配一个额外的索引。所以每个char-array需要扩展1个额外的地方 –

+1

@MahmoudAyman你的代码是一个简单的状态机;你需要给它增加一个状态 - 在单词之后但在后缀之前。创建一个'after_found'标志,并且在该单词后面看到不是'isspace(...)'的第一个字符时,将其设置为1。我想你在''之前''后面的空白处有类似的问题。 – dasblinkenlight

相关问题