程序在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;
}