0

我不知道如何将字符串存储在 C 中的数组中,每个字符单独保存。例如,如果用户输入hellop,我想将其存储在给定的数组中,例如userText, userText[0] = h, userText[1] = e,userText[2] = l等等。我知道这很容易,但我还是新手。因此,如果有人可以提供帮助,那就太好了。请解释如何使用指针来做到这一点。

#include<stdio.h>
void main()
{
    char a[10],c;
    int i=0;
    while((c=getchar())!='\n')
    {
        scanf("%c",&a[i++]);
        c=getchar();
     }
     for(i=0;i<11;i++)
         printf("%c",a[i]);
}

eoeoeoeo\363当我输入时,程序会输出一些垃圾值 ( ) hellop

4

3 回答 3

10

要读取输入,我建议使用fgets函数。这是一个不错的、安全的替代方案scanf

首先让我们像这样声明一个缓冲区:

char user_input[20];

然后我们可以通过以下方式从命令行获取用户输入:

fgets(user_input, 20, stdin);

这将从标准输入将最多 20 个字符存储到字符串中,并确保它是空终止的。我们将输入限制为前面声明的数组大小的事实确保了缓冲区不会溢出。

然后让我们使用strlen清除输入到字符串中的讨厌的换行符:

user_input[strlen(user_input) -1] = '\0';

Asstrlen返回字符串的大小,直到空终止符但没有它,我们可以确定在该位置是换行符 ( \n)。我们用一个空终止符(\0)替换它,以便字符串在那里结束。

最后,让我们使用printf打印它:

printf("The user has entered '%s'\n", user_input);

要使用fgetsprintf您需要声明以下标头:

#include <stdio.h>

因为strlen我们需要另一个标题,即:

#include <string.h>

任务完成。

PS如果我可以解决您添加到问题中的代码。

  1. main通常声明为int main而不是void mainwhich 也要求main返回某种值。对于小型应用程序,通常return 0;放在右大括号之前。此返回用于向操作系统指示程序是否成功执行(0 表示一切正常,非零表示存在问题)。

  2. 您不是以空值终止您的字符串,这意味着如果您以任何其他方式阅读,而不是仔细循环,您将遇到问题。

  3. 您从用户那里获取输入两次——一次使用getchar,然后使用scanf.

如果您坚持使用您的代码,我已对其进行了一些修改:

#include<stdio.h>
int main()
{
    char a[10];
    int i=0;
    while( (a[i++]=getchar()) != '\n' && i < 10) /* take input from user until it's a newline or equal to 10 */
        ;
     a[i] = '\0'; /* null-terminate the string */
     i = 0;  
     while(a[i] != '\0') /* print until we've hit \0 */
         printf("%c",a[i++]);

     return 0;
}

它现在应该可以工作了。

于 2013-07-06T15:19:11.927 回答
2

要将字符串读入 char 数组:

char *a = NULL;
int read;
size_t len;
read = getline(&a, &len, stdin);
//free memory
free(a);
于 2013-07-06T15:10:19.867 回答
2

你的代码是这样的(除了我添加了一堆空格来提高它的可读性):

 1  #include <stdio.h>
 2  void main()
 3  {
 4      char a[10], c;
 5      int i = 0;
 6      while ((c = getchar()) != '\n')
 7      {
 8          scanf("%c", &a[i++]);
 9          c = getchar();
10      }
11      for (i = 0; i < 11; i++)
12          printf("%c", a[i]);
13   }

逐行分析:

  1. 好的(现在我在#include和之间添加了空格<stdio.h>)。
  2. main()函数返回一个int.
  3. 好的(很难弄错开放式大括号)。
  4. 由于返回值为getchar()an int,需要c单独声明为 an int
  5. 好的。
  6. 需要考虑EOF;应该是while ((c = getchar()) != EOF && c != '\n')。不过,您仍然很容易受到缓冲区溢出的影响。
  7. 好的。
  8. 不好。这从标准输入读取另一个字符,并且不检查 EOF。
  9. 不好。这也从标准输入中读取另一个字符。但是当你回到循环的顶部时,你读到了另一个字符。因此,就目前情况而言,如果您abcdefg在程序中键入,c'a'在循环控制中被赋值,然后被a[0]赋值'b',然后c被赋值'c',然后循环以a[1]get重复'e'。如果我输入了 6 个字符加上换行符,循环将完全终止。因为我声称我输入了 7 个字符,所以第三次迭代分配'g'c,它不是换行符,所以获取换行符,并且程序在循环结束时a[2]等待更多输入和语句。c = getchar();
  10. 好的(同上大括号)。
  11. 不好。您没有考虑循环的提前终止,并且您无条件地访问a[10]数组的一个不存在的元素a(它只有元素 0..9 - C 不是 BASIC!)。
  12. 好的。
  13. 您可能需要在for循环后输出换行符。你应该return 0;main().

因为您的输入缓冲区很短,所以最好编写一个长度检查。如果您使用过char a[4096];,我可能不会打扰您(尽管即便如此,缓冲区溢出的风险很小,可能会带来不良后果)。所有这些导致:

#include <stdio.h>

int main(void)
{
    char a[10];
    int c;
    int i;
    int n;
    for (i = 0; i < sizeof(a) && ((c=getchar()) != EOF && c != '\n')
        a[i++] = c;
    n = i;
    for (i = 0; i < n; i++)
        printf("%c", a[i]);
    putchar('\n');
    return 0;
}

请注意,原始代码和修改后的代码都不会终止字符串。对于给定的用法,没关系。对于一般用途,它不是。

修改后的代码中的最后一个for循环和以下内容putchar()可以(安全地)替换为:

printf("%.*s\n", n, a);

这是安全的,因为指定了长度,因此printf()不会超出初始化数据。要创建一个以空字符结尾的字符串,输入代码需要为它留出足够的空间:

    for (i = 0; i < sizeof(a)-1 && ((c=getchar()) != EOF && c != '\n')
        a[i++] = c;
    a[i] = '\0';

(注意sizeof(a)-1!)

于 2013-07-06T17:03:22.053 回答