c中的二维数组,反转并存储一个句子

时间:2014-05-06 19:47:11

标签: c string

嘿,我对编程非常陌生并且遇到阵列问题。有人可以帮助我完成这个项目。 " c编程现代方法:修改一个反转句子单词的程序,以便在读取句子时将单词存储在二维char数组中,数组的每一行存储一个单词。假设句子不超过30个单词,并且单词长度不超过20个字符。请务必在每个单词的末尾存储一个空字符,以便可以将其视为字符串" (我也不知道它对空字符的看法)。 这是我的尝试,但它不起作用。我觉得我很接近。

#include <stdio.h>

#define MAX_SENTENCE_LEN 80

#define SENTENCE_MAX 30

#define WORD_MAX 20
int main(void)
{
  char ch, sentence[MAX_SENTENCE_LEN] = {' '}, terminator = '.';
  int n, i, j, start, finish;

  printf("Enter a sentence: ");
  for (n = 1; n < MAX_SENTENCE_LEN; n++) {
    ch = getchar();
    if (ch == '.' || ch == '?' || ch == '!') {
      terminator = ch;
      break;
    }
    sentence[n] = ch;
  }

  printf("Reversal of sentence:");
  finish = n;
  for (start = finish - 1; start >= 0; start--) {
    if (sentence[start] == ' ') {
      for (i = start; i < finish; i++)
        putchar(sentence[i]);
      finish = start;
    }
    {

int sentence[SENTENCE_MAX][WORD_MAX];
int word[30][20];
    for (i=0; i< SENTENCE_MAX;i++){
        for (j=0; j<WORD_MAX; j++)
            sentence[i][j]=-1;
            }
}
  }
  printf("%c\n", terminator);

  return 0;}

我写了一个新代码,我认为它更接近我想要的但它仍然不会运行。我有一个错误的编译器或什么? 无论如何这里是新代码

#include<stdio.h>

#define N 100

int main (void)

{
    char sentence[N][N], ch, termChar;
    int i = 0, l = 0, count = 0;
    int j = 0, k, start, finish, word;

    printf("enter a sentence: ");

    while (ch = getchar())
    {
        sentence[i][l++]= ch;
    if (ch == ' ')
        {
            sentence[i][l] = '\0';
            i++;
            l = 0;
            count++;
        }

        if (ch == '.' || ch == '!' || ch == '?')
        { 
                sentence[i][l-1]= ' ';
                sentence[i][l]= '\0';
                termChar = ch;
                count ++;
                break;
        }
    }

    for(i=count ; i>=0; i--)
        printf("%s ", sentence[i]);
    printf("%c\n", termChar);
    return 0; 

    }

2 个答案:

答案 0 :(得分:3)

您的代码在我的环境中完美运行(Windows,C99编译器,32位版本)。我输入了一个简短的句子,它颠倒了它:

enter image description here

关于 我没有得到关于空字符的说法

C字符串由空字符定义:\ 0,位于char数组的末尾。示例char string [] =“word”如下所示:| w | o | r | d | \ 0 |在记忆中。

没有\0,它只是一个char数组,而不是一个字符串,因此不能在任何字符串函数中使用,例如strcpy()strlen(),等。

顺便说一句,sentence创建和初始化:

  char sentence[MAX_SENTENCE_LEN] = {' '};  

不保证char数组的整个长度的内容 这可能是您的环境未运行代码的原因,而我的环境确实如此。 根据编译器,操作系统和其他随机因素,sentence可以填充任何内容。因此,如果您的代码未在您的计算机上运行,​​则可能只需要将sentence初始化为\0。用以下代码替换该行:

  char sentence[MAX_SENTENCE_LEN]; //create 
  memset(sentence, 0 ,MAX_SENTENCE_LEN); //zero all memory
  sentence[0]=' '; //set first char to a space (' '). (not sure why)

同样偶然的是,如果用户输入结果为字符串长度== MAX_SENTENCE_LEN,那么您的程序将崩溃,因为sentence中只有足够的空间用于MAX_SENTENCE_LEN-1 + \0

答案 1 :(得分:0)

#include <stdio.h>

#define MAX_SENTENCE_LEN 80
#define SENTENCE_MAX 30
#define WORD_MAX 20

int main(void){
  char ch, sentence[MAX_SENTENCE_LEN] = {' '}, terminator = '.';
  int n, i, j, start, finish;

  char word[SENTENCE_MAX][WORD_MAX+1];
  int wc=0, wcc=0;

  printf("Enter a sentence: ");
  for (n = 1; n < MAX_SENTENCE_LEN; n++) {
    ch = getchar();
    if (ch == '.' || ch == '?' || ch == '!') {
      terminator = ch;
      break;
    } else if(ch != ' '){
      word[wc][wcc++] = ch;
    } else if(ch == ' '){//this is assumed to be one space between words.
      word[wc++][wcc] = '\0';//null character
      wcc = 0;
    }
    sentence[n] = ch;
  }
  word[wc++][wcc] = '\0';

  printf("Reversal of sentence:");
  finish = n;
  for (start = finish - 1; start >= 0; start--) {
    if (sentence[start] == ' ') {
      for (i = start; i < finish; i++)
        putchar(sentence[i]);
      finish = start;
    }
  }
  printf("%c\n", terminator);
  for(i=wc-1;i>=0;--i){
    printf("%s", word[i]);
    if(i>0)
      putchar(' ');
  }
  printf("%c\n", terminator);
  return 0;
}