2016-04-13 41 views
-1

我是C编程的初学者,我试图“将字符串拆分为单独的单词并反向写入字符串”。反转字顺序的错误

样品输入:Hello World it's FUBAR

样本输出:FUBAR it's World Hello

我有这个代码到目前为止已经试过它的代码块13.12(的Windows 8.1/AMD A8):

#include<stdio.h> 
    #include<string.h> 

    char str[100]; 
    char word[100][100]; 



    int main(){ 
     fgets(str,100,stdin); 
     int i=0,j=0,k=0; 
     for(i=0;i<100;i++){ 
      while(str[i]!=' ' || str[i]!='\0') 
      { 
      word[j][k]=str[i]; 
      i++; 
      j++; 
     } 
     if(str[i]==' '){ 
      k++; 
      } 
     } 
    while(k>0){ 
     for(j=0;j<100;j++){ 
      printf("%s",word[j]); 
      } 
     printf(" "); 
     k--; 
    } 
    return 0; 
    } 

代码编译有0个错误,0个警告。

但是当我构建并运行代码时,它会崩溃并显示错误消息-1073741510。 我已经尝试了好几个小时了,但一直未能弄清楚代码在哪里破坏。请帮我解决这个问题。

+1

难道代码块没有一个集成的调试? –

+0

使用您的调试器来断点/执行代码。 Simples。 –

+0

如果您使用简单的条目(如“01245”),那么它会很有用,因为该字符还会告诉您它来自哪个索引。 –

回答

0

请尝试此代码。
1)消除额外的循环。
2)交换j和k变量。每一行都会构成一个新词。
3)word [0] [1..100]将第一个单词和单词[1] [1..100]作为第二个单词。

int main(){ 
    fgets(str,100,stdin); 
    printf("str is [%s]\n",str); 
    int i=0,j=0,k=0; 
    for(i=0;i<100;i++){ 
     printf("char is [%c]\n",str[i]); 
     if( str[i]!=' ' && str[i]!='\0') 
     { 
      word[j][k]=str[i]; 
      k++; 
     }else if(isspace(str[i]) || str[i] == ' '){ 
      printf("space found\n"); 
      j++; 
     } 
    } 
    printf("value of j [%d]\n",j); 
    while(j>=0){ 
     for(k=0;k<100;k++){ 
      printf("%c",word[j][k]); 
     } 
     printf(" "); 
     j--; 
    } 
    return 0; 
} 
+0

我试着用ideone这个代码,它运作良好([链接] http://ideone.com/lmbe8f)。但是,当我用CodeBlocks尝试它时,我得到了大量填充的输出(Screenshot here:[link] http://i.imgur.com/AvbqnrT.jpg)。我该如何处理这件事? –

+0

输出中显示新行。将第7行更改为if(str [i]!=''&& str [i]!='\ 0'&& str [i]!='\ n') –

0

for循环如下错了,应该是

for(i=0;i<100;i++) 
{ 
    while(str[i]!=' ' || str[i]!='\0') 
    { 
     word[j][k]=str[i]; 
     i++; 
     k++; 
    } 
    if(str[i]==' ') 
    { 
     j++; 
    } 
} 

通知的kj增量交换。

0

第一次增加k而不是j。 In if(str [i] =='')为word [j] [k]设置空终止符,然后增加j而不是k。

0

下面是一个更正后的代码。请注意,输出不是完全在一行中。例如,输出将总是像这样,

编辑:感谢雷克萨斯在评论中提醒的一点。我能够缓解这个问题有点

变化代码所做的:

更改下面的代码行

for(i=0;i<strlen(str);i++) 

for(i=0;i<strlen(str)-1;i++) 

虽然,在输出同一行中所有单词的问题已解决,但还有另一个单词问题。现在第一个和第二个词之间没有空格。

因此,新的问题是,

实施例1:

Input: Welcome to Bravo 
Output: Bravoto Welcome 

实施例2:

Input: Hello World it's FUBAR 
Output: FUBARit's World Hello 

暂时解决上述问题是改变该代码

for(m=j;m>=0;m--){ 
     printf("%s",word[m]); 
    } 

向该代码,

for(m=j;m>=0;m--){ 
    if(m == j){ 
     printf("%s ",word[m]); 
    } 
    else{ 
     printf("%s",word[m]); 
    } 
} 

(我想的发生是由于从一维阵列的二维阵列映射这个问题,并有可能是参与一些填充。) - >编辑:这不是由于填充但,“我想这个问题是由于...” - 不,它是由于fgets,它也存储了终止的换行代码 - Rad Lexus。

不管怎么说,这里是代码,

#include<stdio.h> 
#include<string.h> 

char str[100]; 
char word[100][100]; 

int main(){ 

    int i=0,j=0,k=0; 
    int m=0; 

    fgets(str,100,stdin); 

    for(i=0;i<strlen(str)-1;i++){ 
     if(str[i]!=' '){ 
      word[j][k]=str[i]; 
      //printf("%c",word[j][k]); 
      k++; 
     } 
     if(str[i] == ' ' || str[i] == '\0'){ 
      word[j][k]=' '; 
      k=0; 
      j++; 
     } 
    } 
    for(m=j;m>=0;m--){ 
     printf("%s",word[m]);/*----->TEMPORARY SOLUTION 
             for(m=j;m>=0;m--){ 
             if(m == j){ 
              printf("%s ",word[m]); 
             } 
              else{ 
              printf("%s",word[m]); 
              } 
             }*/ 
} 

return 0; 
} 
+0

“我想这个问题是由于..” - 不,这是由于'fgets',它也存储了终止换行符代码。 – usr2564301

+0

@Rad lexus感谢提醒我忘记了存储换行代码的fgets。 – LuckyAli