簡體   English   中英

c中的字符未初始化指針

[英]Character non initialised pointer in c

我正在學習c編程語言。

我寫了一個代碼來只打印給定字符串中的英文字母。

此代碼的輸出是分段錯誤

#include <stdio.h>

char *onlyalpha(char *str) {
  char *res;
  int k = 0;
  for (int i = 0; *(str + i) != '\0'; i++) {
    if (str[i] >= 65 && str[i] <= 90 || str[i] >= 97 && str[i] <= 122)
      res[k++] = str[i];
  }
  res[k] = '\0';
  return res;
}

int main() {
  printf("%s\n", onlyalpha("Raj12she&#khar"));
  return 0;
}

請幫助使用此代碼。

在其他代碼中,我編寫了strcat2()函數,我可以修改未初始化的字符串,這可以按我的意願工作,即加入兩個字符串。

下面是代碼

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

char *strcat2(char *s, char *sr) {
  char *r;
  int l1, l2;
  l1 = strlen(s);
  l2 = strlen(sr);
  for (int i = 0; *(s + i) != '\0'; i++) {
    r[i] = s[i];
  }
  int i = 0;
  for (l1; *(sr + i) != '\0'; i++) {
    r[l1++] = sr[i];
  }
  r[l1]='\0';
  return r;
}

int main() {
  char str[] = "Rajashekhar", str2[] = " Dodamani";
  char *RD;
  RD = strcat(str, str2);
  puts(str);
  puts(RD);

  char *s = "Kaveri", *sr = "Dodamani";
  // s=strcat(s,sr);//s is read only ,this segmentation fault
  s = strcat2(s, sr);
  puts(s);
  return 0;
}
  1. 最大的問題:

    字符 *res;
    //...
    res[k++] = str[i];
    //...
    res[k] = '\\0';

這會寫入內存中的某個隨機位置。 如果這在您的第二個程序中有效,那純屬運氣。

你應該做這樣的事情:

char *strcat2(char *s, char *sr) {
  char *r;
  int l1, l2;
  l1 = strlen(s);
  l2 = strlen(sr);
  r = malloc(l1 + l2 + 1); //// <<<<<<<<<<<< make some space for the new string (+1 for '\0'
  for (int i = 0; *(s + i) != '\0'; i++) {
    r[i] = s[i];
  }
  int i = 0;
  for (l1; *(sr + i) != '\0'; i++) {
    r[l1++] = sr[i];
  }
  r[l1]='\0';
  return r;
}

稍后可能會釋放內存,這只有在您存儲它的地址時才有可能。 這應該擺脫 strcat2 的段錯誤。

我建議閱讀一些關於 malloc 和 free 的內容。

  1. libc strcat 還需要您為它保留一些空間來寫入:

從MAN頁面:

char *strcat(char *dest, const char *src);

strcat() 函數將 src 字符串附加到 dest字符串,覆蓋dest末尾的終止空字節('\\0'),然后添加終止空字節。 字符串不能重疊,dest 字符串必須有足夠的空間用於結果。 如果dest不夠大,程序行為是不可預測的;

您需要保留比第一根弦需要的更大的區域,以便將第二根弦放入其中。

char str = "Rajashekhar", str2[] = " Dodamani";
char *s = malloc(strlen(str) + strlen(str2) + 1);
strcpy(s, str); // strcpy may also be dangerous if s is not big enough!
strcat(s, str2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM