Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
在通过scanf读取c中的两个数组时,第二个数组以某种方式修改了第一个数组_C_String_Input_Scanf - Fatal编程技术网

在通过scanf读取c中的两个数组时,第二个数组以某种方式修改了第一个数组

在通过scanf读取c中的两个数组时,第二个数组以某种方式修改了第一个数组,c,string,input,scanf,C,String,Input,Scanf,我在通过scanfscanf读取两个字符串时遇到以下问题:我插入了第一个字符串,一切正常,但插入第二个字符串后,第一个字符串发生了变化 #include<stdio.h> #define N 6 #define K 2 int main(){ char a[N]; char b[K]; int i = 0,j=0; printf("first word\n\n\n"); scanf("%s", a); for(i = 0; i &l

我在通过scanf
scanf
读取两个字符串时遇到以下问题:我插入了第一个字符串,一切正常,但插入第二个字符串后,第一个字符串发生了变化

#include<stdio.h>
#define N 6
#define K 2

int main(){
    char a[N];
    char b[K];
    int i = 0,j=0;
    printf("first word\n\n\n");

    scanf("%s", a);
    for(i = 0; i <= N; i++){
        printf("%c", a[i]);
    }

    printf("second word \n\n\n");

    scanf("%s", b);
    for(i = 0; i <= N; i++){
        printf("%c", a[i]);
    }
}
#包括
#定义n6
#定义k2
int main(){
字符a[N];
字符b[K];
int i=0,j=0;
printf(“第一个单词\n\n\n”);
scanf(“%s”,a);

对于(i=0;i您正在打印
a
两次,将第二个
printf(“%c”,a[i]);
更改为
printf(“%c”,b[i]);
您正在打印
a
两次,将第二个
printf(“%c”,a[i]);
更改为
printf(“%c”,b[i];
对于第二个
printf您必须编写

printf("%c", b[i]);

对于第二个
printf
,您必须编写

printf("%c", b[i]);
根据您提到的输入(abcabc和abc),您提供给scanf的输入导致变量a和b溢出, 您应该输入长度为5的字符串作为第一个字符串,长度为1的字符串作为第二个字符串,并为这两个字符串保留空间
\0

编辑:根据您向scanf提供的输入(abcabc和abc),将循环条件从
i更改为导致变量a和b溢出,
您应该输入长度为5的字符串作为第一个字符串,长度为1的字符串作为第二个字符串,并为这两个字符串保留空间
\0


编辑:同时将循环条件从
i更改为开始,您将打印数组
a
两次;似乎您的意思是使用第二个循环打印
b
。但是循环中存在一个问题。它们超出了数组边界。由于数组在C中为零索引,因此您需要:

for (i = 0; i < N; i++) {}
对于
b

但即使这样也不完全正确,因为输入字符串可能不会完全填充数组。当到达空终止符或数组末尾时,您确实需要终止循环:

for (i = 0; a[i] != '\0' && i < N; i++) {}

首先,您要打印两次数组
a
;似乎您想用第二个循环打印
b
。但是循环中有一个问题。它们超出了数组边界。由于数组在C中为零索引,您需要:

for (i = 0; i < N; i++) {}
对于
b

但即使这样也不完全正确,因为输入字符串可能不会完全填充数组。当到达空终止符或数组末尾时,您确实需要终止循环:

for (i = 0; a[i] != '\0' && i < N; i++) {}

您遇到的问题是,由于未能确保字符串以nul结尾,并且使用了有关
b
的错误限制,因此调用了未定义的行为

#define N 6
#define K 2
...
    char a[N], b[K];
a
可以容纳总共
5个字符
+nul终止符,而对于总共
6个字符
b
而言,只能容纳总共
1个字符
+nul终止符


当您随后使用
for(i=0;i循环
a
b
时,您遇到的问题是,您调用未定义的行为时没有确保字符串以nul结尾,并且使用了关于
b
的不正确限制。例如,您

#define N 6
#define K 2
...
    char a[N], b[K];
a
可以容纳总共
5个字符
+nul终止符,而对于总共
6个字符
b
而言,只能容纳总共
1个字符
+nul终止符


当您随后使用
for(i=0;i循环
a
b
时,我看到您可以在这里执行两件事:

  • 使用另一个将加载数据的大缓冲区数组,并将数据复制到specyfic数组。这样,在a[]中,第一个字最多可以有6个字母,在b[]中,第二个字最多可以有2个字母。但您可以加载2个字

  • Scanf在评论中提到的@xing等特殊字符数量

  • scanf(“%6s”,word)
    //一般用途,不适用于OP


    比设置的字号更长时,剩下的输入将作为第二个字号的输入。

    我看到您可以在这里做两件事:

  • 使用另一个将加载数据的大缓冲区数组,并将数据复制到specyfic数组。这样,在a[]中,第一个字最多可以有6个字母,在b[]中,第二个字最多可以有2个字母。但您可以加载2个字

  • Scanf在评论中提到的@xing等特殊字符数量

  • scanf(“%6s”,word)
    //一般用途,不适用于OP


    当你的字数比你设置的字数长时,你将把剩下的输入作为第二个字的输入。

    你为两个scanf输入了什么?“显然是我在数组维数方面尝试的输入。”--这是真的吗?
    for(I=0;I可能
    for(I=0;a[I]&&I
    @Pras、abcabc和abc。这些输入不考虑数组的尺寸。请参阅;当使用
    %s
    scanf()
    时,应始终指定最大宽度,以避免缓冲区溢出。您为两个scanf输入了哪些输入?“显然是我在考虑数组尺寸时尝试的输入。”--这是真的吗?
    for(i=0;i可能
    for(i=0;a[i]&&i
    @Pras、abcabc和abc。这些输入不考虑数组维度。请参见;在使用
    %s
    scanf()
    时,应该始终指定最大宽度,以避免缓冲区溢出。另外,最好改为:
    for(i=0;i用于
    a
    ,和:
    用于
    b
    以避免未定义的行为。你是对的,我没有注意到。另外,最好改为:
    用于(i=0;i
    用于
    a
    ,和:
    用于(i=0;i
    用于
    b
    以避免未定义的行为。你说得对,我没有注意到这一点。这无关紧要,因为OP循环无论如何都会超出数组边界……True,added and edit
    #include <stdio.h>
    
    #define N 6
    #define K 2
    
    int main (void ) {
    
        char a[N], b[K];
        int i = 0/*, j = 0*/;
    
        printf ("enter first word: ");
        if (scanf ("%5s", a) != 1) {
            fprintf (stderr, "error: invalid input - a.\n");
            return 1;
        }
    
        for (i = 0; a[i] && i < N; i++)
            printf ("%c", a[i]);
        putchar ('\n');
    
        printf ("enter second word: ");
    
        if (scanf ("%1s", b) != 1) {
            fprintf (stderr, "error: invalid input - b.\n");
            return 1;
        }
    
        for (i = 0; b[i] && i < N; i++)
            printf ("%c", b[i]);
        putchar ('\n');
    
        return 0;
    }
    
    $ ./bin/twowords
    enter first word: cats
    cats
    enter second word: dogs
    d