Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
程序在C中获取不确定数量的字符串并将其打印出来_C - Fatal编程技术网

程序在C中获取不确定数量的字符串并将其打印出来

程序在C中获取不确定数量的字符串并将其打印出来,c,C,作为作业的一部分,我应该编写一个接受无限数量字符串的小程序,然后打印出来。 此程序编译(带有以下警告) desafio1.c:24:16: warning: format not a string literal and no format arguments [-Wform at-security] printf(words[i]

作为作业的一部分,我应该编写一个接受无限数量字符串的小程序,然后打印出来。 此程序编译(带有以下警告)

desafio1.c:24:16: warning: format not a string literal and no format arguments [-Wform
at-security]                                                                          
         printf(words[i]);
并在屏幕上打印以下字符:
�����8.���@Rl�。我猜它没有正确地使用getchar结束我输入的字符串,它打印出垃圾。程序的逻辑是启动while循环,直到我按下enter键
\n
,如果有空格,这是一个将存储在字符-单词数组中的单词。为什么我要运行I对于问题,如果在else语句中找到空格后,我关闭单词[I]=
\0
,并以这种方式将结果存储在数组单词中

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

int main()                                                                        
{
    char words[100][100];
    int i,c;
    char word[1000];

    while((c = getchar()) != '\n')                                                
    {                                                                             
         if (c != ' '){                                                            
            word[i++] = c;                                                         
            c = getchar();                                                         
          }                                                                        
         else{                                                                     
             word[i] = '\0';                                                       
              words[i] == word;                                                     
          }                                                                         
      }                                                                             
      int num = sizeof(words) / sizeof(words[0]);                                   
      for (i = 0; i < num; i++){                                                    
          printf(words[i]);                                                         
      }                                                                             
     return 0;                   
} 
#包括
#包括
int main()
{
字符字[100][100];
int i,c;
字符字[1000];
而((c=getchar())!='\n')
{                                                                             
如果(c!=“”){
字[i++]=c;
c=getchar();
}                                                                        
否则{
字[i]='\0';
字[i]==字;
}                                                                         
}                                                                             
int num=sizeof(单词)/sizeof(单词[0]);
对于(i=0;i
以下是对代码的一些修复。作为指针(如其他注释中所述),请确保启用编译器警告,这将帮助您找到90%的问题。(
gcc-Wall

#包括
#包括
int main(){
字符字[100][100];
int i=0;
int j=0;
INTC;
字符字[1000];
而((c=getchar())!='\n'){
如果(c!=''){
字[i++]=c;
}否则{
字[i]='\0';
strcpy(words[j++],word);
i=0;
}
}
字[i]='\0';
strcpy(words[j++],word);
对于(i=0;i
  • i
    未初始化,因此其值未定义。它应该从0开始。它还需要在每个单词后重置为0,以便从开头开始
  • 第二个
    c=getchar()
    是不必要的,因为循环的每次迭代都会这样做。这会导致代码每隔一个字母跳过一次
  • 您需要两个计数器,一个用于单词中的位置,另一个用于读取单词的数量。这就是
    j
    的含义
  • =
    用于比较,而不是赋值。无论哪种方式,这里都需要
    strcpy()
    ,因为您正在填充数组
  • 不要循环遍历数组的所有100个元素,只需循环遍历实际已填充的单词(最多
    j
  • 代码忽略了最后一个单词输入,因为它以
    \n
    结尾,而不是
    。这就是
    while
    后面的行的用途
  • 使用
    printf()
    时,参数应始终是格式字符串(
    “%s”
    ),后跟参数
  • 当然,还有一些我没有解决的问题(比如1000个字符的
    单词与100个字符的
    单词之间的不一致)。如果我是你,我会考虑如果用户出于某种原因在一个单词中输入超过1000个字符,或超过100个单词,该怎么办。在这种情况下,需要修改您的逻辑,以防止非法内存访问(超出数组的界限)


    作为提醒,此程序不接受无限字数,但最多只能接受100个。因此,您可能需要重新考虑您的解决方案。

    以下是对代码的一些修复。作为指针(如其他注释中所述),请确保启用编译器警告,这将帮助您找到90%的问题。(
    gcc-Wall

    #包括
    #包括
    int main(){
    字符字[100][100];
    int i=0;
    int j=0;
    INTC;
    字符字[1000];
    而((c=getchar())!='\n'){
    如果(c!=''){
    字[i++]=c;
    }否则{
    字[i]='\0';
    strcpy(words[j++],word);
    i=0;
    }
    }
    字[i]='\0';
    strcpy(words[j++],word);
    对于(i=0;i
  • i
    未初始化,因此其值未定义。它应该从0开始。它还需要在每个单词后重置为0,以便从开头开始
  • 第二个
    c=getchar()
    是不必要的,因为循环的每次迭代都会这样做。这会导致代码每隔一个字母跳过一次
  • 您需要两个计数器,一个用于单词中的位置,另一个用于读取单词的数量。这就是
    j
    的含义
  • =
    用于比较,而不是赋值。无论哪种方式,这里都需要使用
    strcpy()
    ,因为您正在填写arr
    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char words[100][100];
        int i = 0;
        int j = 0;
        int c;
        char word[1000];
    
        while((c = getchar()) != '\n') {
            if (c != ' '){
                word[i++] = c;
            } else {
                word[i] = '\0';
                strcpy(words[j++], word);
                i = 0;
            }
        }
        word[i] = '\0';
        strcpy(words[j++], word);
    
        for (i = 0; i < j; i++) {
            printf("%s\n", words[i]);
        }
    
        return 0;
    }